保留员工薪水低于阈值时更新员工的工资

时间:2016-06-03 23:07:30

标签: plsql

我有这个问题,我想使用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);

2 个答案:

答案 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 
        );