如何使用此要求在Oracle中创建触发器

时间:2013-12-19 10:31:02

标签: oracle triggers

我创建了3个表:

  • student表包含sid列,snamedept
  • mca表格,其中包含sid列和sname
  • mba表格,其中包含sid列和sname

现在我想创建一个触发器,以便当dept中的值为mca时,sidsname也会进入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;

这显示错误:表级别触发器中不允许新旧参考

1 个答案:

答案 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调用并不是很有用,因为您不能假设正在执行插入操作的人会看到它。如果不满足某些条件,则抛出异常会更常见,这也会阻止主表上的插入。