2

伙计们,我有以下问题:

对工资低于经理工资 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;

但是如何将它们结合在一起呢?

4

2 回答 2

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
)

而已!

但是,如果您需要使用某个程序,您必须自己决定您到底想用它做什么。

每个过程都有一组形式参数,甚至可以是一个空集。由您决定将什么传递给程序。对于这些情况,请咨询您的经理或架构师。

于 2013-02-06T06:31:58.043 回答
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 ;
于 2017-03-11T23:34:38.673 回答