更新员工表

时间:2013-02-06 06:21:45

标签: sql oracle

伙计我有以下问题:

薪水低于经理薪水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)

这是此表的图片:     enter image description here

但我不明白如何使用该程序。如果我这样声明,创建或替换过程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;

但如何将它们组合在一起?

2 个答案:

答案 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 ;