2017-07-30 50 views
0

我有一個簡單的PL/SQL過程,它增加了SCOTT模式的EMP表中僱員的工資。這會收到每個參數和增量的員工編號。執行更新的UPDATE語句不會按該標識符進行過濾,並且在訪問遊標時指示表中的所有行均已更新。隱式遊標指示它爲給定的標識符更新表中的所有行

如果此更新是由SQL Plus提供的。它只更新一行。

CREATE OR REPLACE PROCEDURE INCREASE_SALARY(
    empno EMP.EMPNO%TYPE, 
    incre NUMBER 
) 
AUTHID DEFINER 
AS PRAGMA AUTONOMOUS_TRANSACTION; 
    INCREMENT_MUST_BE_GREATER_THAN_ZERO EXCEPTION; 
BEGIN 

    IF incre = 0 THEN 
     RAISE INCREMENT_MUST_BE_GREATER_THAN_ZERO; 
    END IF; 

    DBMS_OUTPUT.PUT_LINE('EMPLOYEE TO UPDATE: ' || empno); 

    UPDATE EMP 
     SET SAL = SAL + (SAL * incre/100) 
     WHERE EMPNO = empno; 

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT)||' rows affected.'); 

    IF SQL%ROWCOUNT > 0 THEN 
     INSERT INTO TABLA_LOG VALUES(USER, SYSDATE); 
     DBMS_OUTPUT.PUT_LINE('SALARY UPDATED SUCCESSFULLY'); 
    ELSE 
     DBMS_OUTPUT.PUT_LINE('NO EMPLOYEE FOUND FOR THAT ID'); 
    END IF; 

    COMMIT WORK; 

EXCEPTION 
    WHEN INCREMENT_MUST_BE_GREATER_THAN_ZERO THEN 
     DBMS_OUTPUT.PUT_LINE('THE INCREMENT PERCENTAGE MUST BE GREATER THAN 0'); 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('ERROR : ' || SQLCODE || 'MENSAJE: ' || SQLERRM); 
END; 
/

當與EMPNO 7900(JAMES)

SET SERVEROUTPUT ON; 
EXEC INCREASE_SALARY(7900, 20); 

我得到以下輸出執行程序:

EMPLOYEE TO UPDATE: 7900 
13 rows affected. 
SALARY UPDATED SUCCESSFULLY 

Procedimiento PL/SQL terminado correctamente. 

有誰知道我做錯了嗎?提前致謝。

從EMP WHERE EMPNO = 7900中選擇count(1);

返回1.

我正在使用Oracle Enterprise 12c。該過程編譯。標識符錯誤太長不會出現。

+0

做以下返回13?從EMP中選擇計數(1)WHERE EMPNO = 7900 – user7294900

+0

您的過程不會編譯。錯誤是:'錯誤(6,5):PLS-00114:標識符'INCREMENT_MUST_BE_GREATER_THAN'太長'。它必須長達30個字符,實際上它是34個字符==>'INCREMENT_MUST_BE_GREATER_THAN_ZERO'。 – krokodilko

回答

2

您的問題是empno = empno。這些被解釋爲列名稱。

你應該儘量給你的參數和局部變量不同的名稱:

CREATE OR REPLACE PROCEDURE INCREASE_SALARY (
    in_empno EMP.EMPNO%TYPE, 
    iin_ncre NUMBER 
) 
AUTHID DEFINER 
AS PRAGMA AUTONOMOUS_TRANSACTION; 
    INCREMENT_MUST_BE_GREATER_THAN_ZERO EXCEPTION; 
BEGIN 

    IF in_incre = 0 THEN 
     RAISE INCREMENT_MUST_BE_GREATER_THAN_ZERO; 
    END IF; 

    DBMS_OUTPUT.PUT_LINE('EMPLOYEE TO UPDATE: ' || in_empno); 

    UPDATE EMP 
     SET SAL = SAL + (SAL * in_incre/100) 
     WHERE EMPNO = in_empno; 
    . . . 
+0

謝謝,我沒有意識到它。 –

+0

提示:如果無法更改參數名稱,則可以使用過程名稱前綴參數名稱,如:'empno = INCREASE_SALARY.empno'。 – Ftaveras

相關問題