行和表上的语句之间的精确差异

时间:2017-04-28 13:48:53

标签: oracle plsql

这两个块之间的差异以及何时使用第一个或第二个?

Create OR Replace trigger trig_before_insert before insert on Employee For each Row 
Begin 
      DBMS_OUTPUT.PUT_LINE('Inserting');
END;

并且

Create OR Replace trigger trig_before_insert before insert on Employee
Begin 
      DBMS_OUTPUT.PUT_LINE('Inserting');
END;

1 个答案:

答案 0 :(得分:4)

如果您执行

INSERT INTO EMPLOYEE
SELECT ...

并且SELECT返回100行,以便INSERT插入100行,第一个触发器将执行100次,每行一次。在相同的情况下,您的第二个触发器只会执行一次。

您可以使用BEFORE INSERT...FOR EACH ROW触发器通过:NEW变量访问它们来更改正在插入的值。例如,

:new.column_1 := 'a different value';

你不能在语句级触发器中执行此操作(这是你的第二个触发器)。

行级触发器也有限制(这是你的第一个触发器)。特别是,您可能不会从触发器的基表SELECTEMPLOYEES,因为该表被称为"变异"。根据我的理解,确切的原因可以追溯到关系数据库的核心原则 - 特别是语句的结果(如INSERT INTO...SELECT)不应该依赖于处理行的顺序。但是,我认为这种限制的解决方法超出了原始问题的范围。