[英]SQL Triggers - NEW and OLD workarounds
我正在创建一个触发器,该触发器将在对表TEACHING_INFORMATION进行插入或更新时执行操作,从本质上讲,我只是在输入输入的Year字段,并确保同一个人上一年没有相同的课程,并且如果他们不允许的话。 我正在使用:NEW值将现有数据与输入的数据进行比较,但是出现错误(位于下方)。 这是我完成的代码:
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT OR UPDATE OF YEAR ON TEACHING_INFORMATION
DECLARE requestedyear TEACHING_INFORMATION.YEAR%type;
pragma autonomous_transaction;
BEGIN
SELECT year INTO requestedyear FROM TEACHING_INFORMATION WHERE staffID = :NEW.staffID AND COURSEID = :NEW.courseID;
IF (:NEW.year = requestedyear + 1) THEN
RAISE_APPLICATION_ERROR(-20250, 'Cannot teach the same class for 2 consecutive years');
END IF;
END;
错误:
ORA-04082: NEW or OLD references not allowed in table level triggers
我试图将FOR EACH ROW
条件添加到触发器,但是由于出现另一个错误,表明它正在查看太多行,因此这实际上不起作用,因为我真的只需要查看一行。 由于我是触发器的新手,因此我的逻辑可能会有所偏离,但是朝正确方向的任何帮助/指导将不胜感激。
:NEW和:OLD只能在行级触发器(FOR EACH ROW选项)中使用,因此oracle不知道应采用哪个:NEW。 尝试添加: 每行将new引用为new,而old引用为old 。 因此,您的代码应如下所示:
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT OR UPDATE OF YEAR ON TEACHING_INFORMATION
referencing new as new old as old for each row
DECLARE requestedyear TEACHING_INFORMATION.YEAR%type;
pragma autonomous_transaction;
BEGIN
SELECT year INTO requestedyear FROM TEACHING_INFORMATION WHERE staffID = :NEW.staffID AND COURSEID = :NEW.courseID;
IF (:NEW.year = requestedyear + 1) THEN
RAISE_APPLICATION_ERROR(-20250, 'Cannot teach the same class for 2 consecutive years');
END IF;
END;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.