如何编写一个简单的触发器来检查工资何时更新,现有教师的成绩不超过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;
提前致谢。
答案 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