【问题标题】:How to create a trigger in Oracle with this requirements如何在具有此要求的 Oracle 中创建触发器
【发布时间】:2013-12-19 19:15:18
【问题描述】:

我创建了 3 个表:

  • student 包含列 sidsnamedept 的表
  • mca 带有列 sidsname 的表
  • mba 带有列 sidsname 的表

现在我想创建一个触发器,以便当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;

这显示一个错误:表级别触发器中不允许新或旧引用

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    您有一个语句级触发器,但您似乎想要一个行级触发器,因此您需要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 并不是很有用,因为您不能假设执行插入操作的人会看到它。如果不满足某些条件,则更常见的是抛出异常,这也会阻止在主表上插入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-24
      • 2018-02-07
      • 2011-06-21
      • 2012-03-22
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      相关资源
      最近更新 更多