使用触发器更新值

时间:2018-05-10 08:12:30

标签: sql oracle plsql database-trigger

如何编写一个简单的触发器来检查工资何时更新,现有教师的成绩不超过5%。

我这里有一段代码。

create or replace TRIGGER TRG_Not_over_5per
BEFORE UPDATE OF F_SALARY ON FACULTY
DECLARE 
sal FACULTY.F_SALARY%TYPE;
BEGIN
SELECT FACULTY.F_SALARY INTO sal FROM FACULTY
-- how do I use the WHERE CLAUSE here so that I get the salary affected

-- do some math on the first and second salary
-- if less than 5%, keep update, if not, reject update.
END;

提前致谢。

1 个答案:

答案 0 :(得分:3)

您无需在触发器(*)中使用SELECT。将触发器定义为FOR EACH ROW,您可以访问属于该表的任何列的旧值和新值。

create or replace TRIGGER TRG_Not_over_5per
BEFORE UPDATE OF F_SALARY ON FACULTY
FOR EACH ROW

所以你的代码看起来像是:

if :new.f_salary < :old.f_salary * 1.05 then
     raise_application_error (
       -20000
       , 'salary increase must be at least 5%'
    );
end if;

这种处理规则违规的方式只是一个建议。你做任何你需要的事情。您不需要处理ELSE分支:Oracle将默认应用更新。

(*)实际上,如果您尝试执行要编写的查询,Oracle将会抛出变异表异常。 Find out more