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

Sql 为什么我在更新员工工资时触发错误?,sql,oracle,jdbc,Sql,Oracle,Jdbc,这是我运行的sql语句 基本上,我想做的是,当用户试图更新员工的工资时,触发器将自动填充与他/她的工资相对应的员工等级 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

这是我运行的sql语句 基本上,我想做的是,当用户试图更新员工的工资时,触发器将自动填充与他/她的工资相对应的员工等级

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;
员工表 具有名称、部门名称和其他以及薪资和等级等属性

等级表已更改 米萨拉尔 最高工资 成绩信

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'
您正在将薪资设置为25500,该值超出了此表中定义的范围
GRADE


因此,您应该对此表进行查询,并为
工资定义一个在此范围内的值,或者更新
等级
表以适应新的需求范围。

我感到困惑。很明显,如果您试图将薪资设置在员工的等级之外,您的触发代码就会抛出一个错误。你的问题的正文说你想根据薪水改变等级(我们是否假设每个等级都是一个唯一的范围,并且范围之间没有差距?)如果目标是改变等级,为什么会出现
加薪申请错误
呼叫?如果目标是改变成绩,为什么没有任何东西试图设置
:new.GLetter
  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;