为什么我更新员工工资时会触发错误?

时间:2021-04-06 17:25:47

标签: sql oracle jdbc

create or replace TRIGGER CHECK_GRADE
    BEFORE INSERT OR UPDATE ON EMPLOYEE
    FOR EACH ROW
DECLARE
    LoSal NUMBER(8, 2);
    HiSal NUMBER(8, 2);
    Letter VARCHAR(1);
    Sal NUMBER(8, 2);
BEGIN
    IF(:NEW.GLetter IS NOT NULL)
    THEN
        Sal := NVL(:NEW.Salary, -1);

        SELECT MinSalary, MaxSalary
        INTO LoSal, HiSal
        FROM GRADE
        WHERE GLetter = :NEW.GLetter;

        IF(NOT(Sal BETWEEN LoSal AND HiSal))
        THEN
            RAISE_APPLICATION_ERROR(-20001, 'Salary does not correspond to grade error! ' );
        END IF;
    ELSIF(:NEW.Salary IS NOT NULL) 
    THEN
        SELECT GLetter
        INTO Letter
        FROM GRADE
        WHERE :NEW.Salary BETWEEN MinSalary AND MaxSalary;
        :NEW.GLetter := Letter;
    END IF;
END;

这是我运行的sql语句 基本上我想要做的是,当用户尝试更新员工的薪水时,触发器将自动填充与其薪水相对应的员工等级

update employee set salary = 25500 where employeeid = 1006; 

员工表 具有姓名、部门名称等属性以及薪水和等级

成绩表有 最低工资 最高工资 成绩单

Error starting at line : 2 in command -
update employee set salary = 25500 where employeeid = 1006
Error report -
ORA-20001: Salary does not correspond to grade error!
ORA-06512: at "gh12345.CHECK_GRADE", line 18
ORA-04088: error during execution of trigger 'gh12345.CHECK_GRADE'

1 个答案:

答案 0 :(得分:0)

由于此处的这一部分而引发错误:

  SELECT MinSalary, MaxSalary
        INTO LoSal, HiSal
        FROM GRADE
        WHERE GLetter = :NEW.GLetter;

        IF(NOT(Sal BETWEEN LoSal AND HiSal))
        THEN
            RAISE_APPLICATION_ERROR(-20001, 'Salary does not correspond to grade error! ' );
        END IF;

您将工资设置为值 25500,该值超出了此表 GRADE 中定义的范围。

因此,您应该对该表进行查询并为该范围内的 Salary 定义一个值,或者更新 GRADE 表以获得新的不想要的范围。