2015-08-21 94 views
-1

我想寫一個PROCEDURE,它將首先打印僱員的僱員號碼和工資(即7839)。然後,它會增加僱員7839的薪水(這將是在表中僱員僱員號),按照以下條件:轉換爲PROCEDURE pl/sql

Condition-1: If experience is more than 10 years, increase salary by 20%. 
Condition-2: If experience is greater than 5 years, increase salary by 10%. 
Condition-3: All others will get an increase of 5% in the salary. 

程序將之前和之後的增加我試圖在打印員工編號和工資下面的步驟,但不知道它有多準確。

我需要將其轉換爲PROCEDURE代碼。

請指教

DECLARE 
    veno emp.empno%type:=&veno; 
    vsal emp.sal%type; 
    vexp number; 
BEGIN 
    select empno,sal,trunc(to_char(months_between(sysdate,hiredate)/12))into veno,vsal,vexp from emp where empno=veno; 
DBMS_OUTPUT.PUT_LINE('before update:' ||chr(10)||veno||chr(10)||vsal); 
    if vexp>=10 then 
     update emp set sal=sal+(sal*.20) where empno=veno; 
     select sal into vsal from emp where empno=veno; 
     DBMS_OUTPUT.PUT_LINE('after update:' ||chr(10)||vsal); 
    elsif vexp>=5 then 
     update emp set sal=sal+(sal*.10) where empno=veno; 
     select sal into vsal from emp where empno=veno; 
     DBMS_OUTPUT.PUT_LINE('after update:' ||chr(10)||vsal); 
    else 
     update emp set sal=sal+(sal*.05) where empno=veno; 
     select sal into vsal from emp where empno=veno; 
     DBMS_OUTPUT.PUT_LINE('after update:' ||chr(10)||vsal); 
    end if; 
END; 
/
+0

我的第一個想法是,這個程序將被視爲一個匿名塊,而不是一個程序。過程是一個可以按名稱調用的存儲程序。其次,雖然該計劃並不漂亮,但它似乎可以根據您發佈的要求進行工作。 –

+0

那麼,你是否想從你的代碼中創建過程? – Marusyk

+0

是的,我想創建一個程序出我的代碼..請幫助 – Chaz

回答

1

所有你需要改變的是DECLARE(表示一個匿名塊的開始)到CREATE PROCEDURE,與您目前通過作爲一個正式的說法置換變量設置變量;所以不是:

DECLARE 
    veno emp.empno%type:=&veno; 
    vsal emp.sal%type; 
    vexp number; 
BEGIN 
... 
END; 
/

讓它:

CREATE OR REPLACE PROCEDURE my_proc (veno IN emp.empno%type) 
AS 
    vsal emp.sal%type; 
    vexp number; 
BEGIN 
... 
END; 
/

然後,您可以調用從一個匿名塊,或在SQL * Plus或與execute速記SQL開發人員:

set serveroutput on 
execute my_proc(&veno); 

此示例仍在使用替代變量,因此您將被提升爲要使用的值,但您也可以直接傳遞一個數字。

Read more about creating proceduresparameters的類型。

您可以相當簡化代碼以減少重複和重新查詢;查看案例表達式和返回子句。但這並不直接相關。