隐式游标表示它更新表中给定标识符

时间:2017-07-30 11:06:46

标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper

我有一个简单的 PL / SQL过程,可以增加SCOTT模式的EMP表中员工的工资。这将接收每个参数和增量的员工编号。执行更新的UPDATE语句不会按该标识符进行过滤,并且在访问游标的 ROWCOUNT 时表示表中的所有行都已更新。

如果我从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。程序编译。标识符错误太长不会出现。

1 个答案:

答案 0 :(得分: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;
    . . .