2012-10-08 44 views
0

我需要做下面的問題,PL/SQL如何寫多個語句在單個存儲過程

編寫由10%降低工資誰掙得比目前的平均 減去所有員工的程序薪水。 將表EMP的內容視爲「所有員工」。讓你的程序打印第一個 工資低於平均水平的人的姓名和工資。

應該怎樣解決問題?

編寫一個程序,爲所有低於當前平均工資的員工降低工資10%。

CREATE OR REPLACE PROCEDURE UPDATE_EMP IS 
BEGIN 
UPDATE EMP 
SET SAL= SAL-(SAL*0.1) 
WHERE SAL<(SELECT AVG(SAL) FROM EMP); 
END; 

,另一種: 讓你的程序打印的姓名和第一人稱其薪水只是低於平均工資。

SELECT e.ename 
    , e.sal 
from 
    (select ename 
      , sal 
     from emp 
     where sal < (select avg(sal) 
        from emp 
        ) 
    order by sal desc 
    )e 
    where ROWNUM =1; 

現在我需要同時連接。我怎麼能這樣做?

+2

請用目前爲止寫的代碼更新問題。 – Annjawn

+0

編寫一個程序,將所有低於當前平均工資的員工的工資降低10%。 –

+0

@Hoque:只需編寫一個遊標,即可獲取當前工資低於當前平均工資的員工。在循環內首先放置一個dbms語句,它將打印emp細節,並且下一個語句將emp的工資更新爲10%。我不知道你爲什麼要爲此創建多個過程。如果你指的是其他的東西,請相應地編輯你的問題 –

回答

1

這聽起來像你是在一個存儲過程是什麼有點模糊,以及它如何可以幫助你做複雜的任務涉及許多SQL語句。

您按照如何構建存儲過程這些方向。

http://www.devshed.com/c/a/Oracle/Oracle-Stored-Procedures/

存儲過程是美妙的結構,使您能夠將多個SQL語句組合成一個結構,節省出的變量在一個SQL語句中使用。因此,你所要做的就是調用存儲過程,並且運行所有的sql語句,並返回你的答案或提交表修改。

你需要的東西是這樣的:

CREATE OR REPLACE PROCEDURE UPDATE_EMP RETURN name, value IS 
BEGIN 

    UPDATE EMP 
    SET SAL= SAL-(SAL*0.1) 
    WHERE SAL<(SELECT AVG(SAL) FROM EMP); 

    SELECT e.ename INTO name_to_return, e.sal INTO sal_to_return from 
    (select ename, sal from emp where sal < (select 
    avg(sal)from emp) order by sal desc)e where ROWNUM =1; 

    RETURN name_to_return, sal_to_return; 
END; 

的語法可能有點過,當你得到它的工作,在這裏發表你的答案作爲一個新的答案,並檢查其標記爲答案,你很多更有可能在未來得到這樣的幫助。

+0

是的,我怎麼能把它們合併到一個程序中 –

+0

我認爲我需要聲明變量的select語句 –

+0

我該如何處理這個問題「將EMP的內容視爲」所有員工「。 –

0

您需要一個過程來執行更新,而另一個函數或select語句可以打印第一個工資低於平均水平的第一個人的姓名和工資。

1
CREATE OR REPLACE PROCEDURE DISPLAY_EMP IS 
    IS 
    CURSOR emp_cur 
    IS 
    SELECT ename 
      ,sal 
    FROM emp 
    WHERE SAL<(SELECT AVG(SAL) FROM EMP) 
    ORDER BY sal desc; 
    v_emp_row emp_cur%ROWTYPE; 

    BEGIN 
    --update all the employee having sal less than avg sal 

    UPDATE EMP 
    SET SAL= SAL-(SAL*0.1) 
    WHERE SAL<(SELECT AVG(SAL) FROM EMP); 

    --display all the employee having sal less than avg sal 
    OPEN emp_cur ; 
     LOOP 
     FETCH emp_cur INTO v_emp_row; 
     EXIT WHEN emp_cur%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE('EMPLOYEE NAME : '||v_emp_row.ename||' ' 
         ||'SALARY : '||v_emp_row.sal); 
     END LOOP; 
     CLOSE emp_cur; 
    END DISPLAY_EMP; 

    --call the display_emp proc to display all the emp 
    BEGIN 
    DISPLAY_EMP ; 
    END; 
+0

謝謝它的工作原理我 –

0

CREATE OR REPLACE PROCEDURE DISPLAY_EMP IS IS CURSOR emp_cur IS SELECT ENAME ,SAL FROM EMP WHERE SAL <(SELECT AVG(SAL)FROM EMP) ORDER BY SAL降序; v_emp_row emp_cur%ROWTYPE;

BEGIN 
--update all the employee having sal less than avg sal 

UPDATE EMP 
SET SAL= SAL-(SAL*0.1) 
WHERE SAL<(SELECT AVG(SAL) FROM EMP); 

--display all the employee having sal less than avg sal 
OPEN emp_cur ; 
    LOOP 
    FETCH emp_cur INTO v_emp_row; 
    EXIT WHEN emp_cur%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE('EMPLOYEE NAME : '||v_emp_row.ename||' ' 
        ||'SALARY : '||v_emp_row.sal); 
    END LOOP; 
    CLOSE emp_cur; 
END DISPLAY_EMP; 

--call的display_emp PROC來顯示所有的EMP BEGIN DISPLAY_EMP; END;

相關問題