我创建了3个表:
student
表包含sid
列,sname
和dept
mca
表格,其中包含sid
列和sname
mba
表格,其中包含sid
列和sname
现在我想创建一个触发器,以便当dept
中的值为mca
时,sid
和sname
也会进入mca
表,如果它是mba
,那么它们会进入mba
表。
这就是我尝试过的,based on a previous answer:
CREATE OR REPLACE TRIGGER MY_TRIGG
AFTER INSERT ON STUDENTS
BEGIN
IF STUDENTS.DPTID=101 THEN
INSERT INTO MCA VALUES(:NEW.SID,:NEW.SNAME);
ELSIF STUDENTS.DPTID=102 THEN
INSERT INTO MCA VALUES(:NEW.SID,:NEW.SNAME);
ELSE
DBMS_OUTPUT.PUT_LINE('NO DEPARTMENT IS FOUND');
END;
这显示错误:表级别触发器中不允许新旧参考
答案 0 :(得分:0)
你有一个语句级触发器,但你似乎想要一个行级触发器,所以你需要for each row
clause。您的DPTID
引荐也应该针对当前行,而不是:NEW
而不是STUDENTS
:
CREATE OR REPLACE TRIGGER MY_TRIGG
AFTER INSERT ON STUDENTS
FOR EACH ROW
BEGIN
IF :NEW.DPTID=101 THEN
INSERT INTO MCA (SID, SNAME) VALUES (:NEW.SID,:NEW.SNAME);
ELSIF :NEW.DPTID=102 THEN
INSERT INTO MBA (SID, SNAME) VALUES (:NEW.SID,:NEW.SNAME);
ELSE
DBMS_OUTPUT.PUT_LINE('NO DEPARTMENT IS FOUND');
END IF;
END;
我也添加了一个END IF
。您可能需要考虑CASE
语句,而不是IF/ELSIF/ELSE
。您应该明确列出列名作为INSERT
语句的一部分。
在触发器中进行DBMS_OUTPUT
调用并不是很有用,因为您不能假设正在执行插入操作的人会看到它。如果不满足某些条件,则抛出异常会更常见,这也会阻止主表上的插入。