我有一個簡單的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。該過程編譯。標識符錯誤太長不會出現。
做以下返回13?從EMP中選擇計數(1)WHERE EMPNO = 7900 – user7294900
您的過程不會編譯。錯誤是:'錯誤(6,5):PLS-00114:標識符'INCREMENT_MUST_BE_GREATER_THAN'太長'。它必須長達30個字符,實際上它是34個字符==>'INCREMENT_MUST_BE_GREATER_THAN_ZERO'。 – krokodilko