伙计们,我有以下问题:
对于薪水低于经理工资50%的员工,加薪15%。使用游标、循环和update编写PL/SQL过程。
过程标头创建或替换过程inc_salary
为:
。如果加薪后的工资超过经理工资的50%,则例外。
实际上,我们可以直接这样做:
update emp e
set e.salary+=e.salary*0.15
where e.salary<(select e.mgr from emp e, group by e.mgr)
这是这张表格的图片:
但是我不知道怎么使用这个程序。如果我像这样声明它,创建或替换过程inc_salary
,那么它的参数应该是什么?当然,我们可以使用循环,比如
declare
for r in (select * from emp e) loop
update emp e
set r.salary+=r.salary*0.15;
where r.salary<r.mgr
exception
if r.salary >r.mgr*1.15 then
dbms.output_putline(' it can't increase');
end loop;
end;
但是如何将它们结合在一起呢?
发布于 2013-02-06 06:31:58
为什么需要PL/SQL过程?一个简单的查询就可以完成这项工作!
UPDATE emp
SET salary = salary * 1.15
WHERE empno IN (
SELECT e.empno
FROM emp e
JOIN emp m ON e.mgr = m.empno
WHERE e.salary < m.salary * 0.5
)
就这样!
但是,如果你需要使用一个过程,你必须自己决定你到底想要用它做什么。
每个过程都有一组形式参数,这些参数甚至可以是空集。是你决定将什么传递给过程。对于这些情况,请咨询您的经理或架构师。
发布于 2017-03-11 23:34:39
declare
prec number;
procedure inc_salary(prcin number)
is
cursor cl is * from employees;
msal number(8,2);
mid number(6);
begin
for r in cl loop
mid := nvl(r.manager_id, r.employee_id);
select salary into msal from employees where employee_id = mid;
if r.salary < (msal * 0.5) then
update employees set
salary = salary * prc
where employee_id = r.employee_id;
end if;
end loop;
end inc_salary;
begin
prec := 1.5;
inc_salary(prec);
end ;
https://stackoverflow.com/questions/14722839
复制