2013-02-06 54 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 ;