-1

我对 DBMS_OUTPUT.PUT_LINE 有问题,我制作了其中 2 个必须在工资更新前显示,一个在工资更新后显示,但它们都只显示更新,可能我做错了,请检查代码。

CREATE OR REPLACE PROCEDURE SET_SALARY (P_EMP_ID NUMBER , P_ADD_SAL NUMBER)
 IS 
V_NAME VARCHAR2(50) ;
V_SALARY NUMBER ;
V_MANG_NAME VARCHAR2(50); 
V_MANG_SAL NUMBER ;
V_EMP_ID NUMBER ;
V_MNG_ID NUMBER ;
BEGIN 
SELECT LAST_NAME , SALARY  
INTO  V_NAME , V_SALARY 
FROM EMPLOYEES
WHERE EMPLOYEE_ID = P_EMP_ID ;
DBMS_OUTPUT.PUT_LINE (V_NAME || ' Before: '||V_SALARY );  <===(must show for select)
UPDATE EMPLOYEES
SET SALARY = SALARY + P_ADD_SAL
WHERE EMPLOYEE_ID = P_EMP_ID ;
DBMS_OUTPUT.PUT_LINE (V_NAME || ' After: '||V_SALARY ); <==(must show after update)
SELECT E.EMPLOYEE_ID , E.LAST_NAME, E.SALARY ,E.MANAGER_ID,M.LAST_NAME , M.SALARY  
INTO V_EMP_ID, V_NAME , V_SALARY ,V_MNG_ID,V_MANG_NAME , V_MANG_SAL 
FROM EMPLOYEES E , EMPLOYEES M 
WHERE E.MANAGER_ID = M.EMPLOYEE_ID 
AND E.EMPLOYEE_ID = P_EMP_ID ;
DBMS_OUTPUT.PUT_LINE (V_MANG_NAME || ' Before: '||V_MANG_SAL );<===(must show for select)
UPDATE EMPLOYEES 
SET SALARY = SALARY  + ( P_ADD_SAL / 2 ) 
WHERE EMPLOYEE_ID = V_MNG_ID ;
DBMS_OUTPUT.PUT_LINE (V_MANG_NAME || ' AFTER: '||V_MANG_SAL );<==(must show after update)
END ;
4

1 回答 1

0

您的问题是您永远不会更新初始语句的变量值V_SALARY和之后的变量值。V_MANG_SALSELECT INTO

如果你想这样做,你需要在RETURNING你的更新语句中添加一个子句。以第一个为例:

UPDATE EMPLOYEES
SET SALARY = SALARY + P_ADD_SAL
WHERE EMPLOYEE_ID = P_EMP_ID 
RETURNING salary INTO v_salary;

这将使用更新后的值更新变量V_SALARY中的值。

于 2021-10-15T14:28:33.703 回答