2013-02-06 27 views
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) 

下面是该表的图片: 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; 

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

回答

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 
) 

就是这样!

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

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

+0

只是讲师需要和:D –

+0

顺便问一下,我怎样才能连接e.mgr到e.empno? –

+0

如果仔细观察,就是'm.empno'。 – Rachcha

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 ;