2017-07-30 16 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

相关问题