伙计我有以下问题:
薪水低于经理薪水50%的员工的薪水增加15%。 使用游标,循环和更新来编写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;
但如何将它们组合在一起?
答案 0 :(得分:1)
为什么需要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
)
就是这样!
但是,如果你需要使用一个程序,你必须自己决定你想用它做什么。
每个过程都有一组形式参数,甚至可以是空集。决定将什么传递给程序的是你。有关这些情况,请咨询您的经理或建筑师。
答案 1 :(得分:0)
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 ;