我有这个问题,我想使用plsql程序更新薪水低于经理薪水0.5的员工的工资,它会编译,但是当我尝试执行代码时它不起作用。知道问题可能是什么?也许来自代码?
CREATE OR REPLACE PROCEDURE INC_SALARY(PRC NUMBER)
IS
BEGIN
LOOP
UPDATE EMP
SET SALARY = SALARY * PRC
WHERE EMP_ID IN(
SELECT E.EMP_ID
FROM EMP E
JOIN EMP M
ON E.MANAGER_ID = M.EMP_ID
WHERE E.SALARY < M.SALARY * 0.5 );
END LOOP;
END INC_SALARY;
EXEC INC_SALARY(1.20);
答案 0 :(得分:0)
根据您在评论中的回答,您完全误解了UPDATE
声明的作用 - 请点击此处UPDATE。
一个UPDATE
语句足以满足您的要求。
在这种情况下永远不需要LOOP
,除非您想要获取每条记录(使用SELECT
语句)并逐个执行UPDATE
(也称为slow by slow
)
要查看使用您的UPDATE
个语句更新了多少员工,您可以执行UPDATE
WHERE
声明中使用的查询:
SELECT
COUNT(E.EMP_ID)
FROM EMP E
JOIN EMP M
ON E.MANAGER_ID = M.EMP_ID
WHERE E.SALARY < M.SALARY * 0.5
我在您的代码中添加了一些注释,向您解释您的代码实际执行的操作:
CREATE OR REPLACE PROCEDURE INC_SALARY(PRC NUMBER)
IS
BEGIN
-- Enter the loop and start executing the code into the loop
-- over and over again
LOOP
-- Update EVERY employee whose salary is less than
-- a half of the salary of his manager
-- setting his salary to his salary multiplied by PRC parameter
UPDATE EMP
SET SALARY = SALARY * PRC
WHERE EMP_ID IN(
SELECT E.EMP_ID
FROM EMP E
JOIN EMP M
ON E.MANAGER_ID = M.EMP_ID
WHERE E.SALARY < M.SALARY * 0.5
);
-- Update finished - loop starts another iteration
-- and calls Update for EVERY employee over and over again
-- Since there's no exit from the loop
-- (loop never ends, iterates infinitely)
-- the execution never ends
END LOOP;
END INC_SALARY;
答案 1 :(得分:0)
在我看来,尽可能尝试使用SQL而不是使用PLSQL。在这种情况下,我可以看到这可以通过单个UPDATE查询完成。如果有任何特定的过程原因,那么请尝试使用简单的UPDATE
UPDATE EMP
SET SALARY = SALARY * PRC
WHERE EMP_ID IN(
SELECT E.EMP_ID
FROM EMP E
JOIN EMP M
ON E.MANAGER_ID = M.EMP_ID
WHERE E.SALARY < M.SALARY * 0.5
);