在甲骨文的BEFORE INSERT TRIGGER中何时不需要FOR EACH ROW?

时间:2017-10-24 16:59:09

标签: sql oracle plsql triggers

我是Oracle的PLSQL新手。当我学习触发器时,我已经从这个源https://www.techonthenet.com/oracle/triggers/before_insert.php中读到了这一点,当我在Oracle中创建BEFORE INSERT触发器时,并不总是需要FOR EACH ROW,因此语法是封闭的用方括号[]。我写了这个简单的触发器:

CREATE OR REPLACE TRIGGER enroll_time
BEFORE INSERT
ON ENROLL
FOR EACH ROW
BEGIN
:new.addtime := sysdate;
END;
/ 

如果我删除上面的FOR EACH ROW,我实际上会收到错误:

Error report -
ORA-04082: NEW or OLD references not allowed in table level triggers
04082. 00000 -  "NEW or OLD references not allowed in table level triggers"
*Cause:    The trigger is accessing "new" or "old" values in a table trigger.
*Action:   Remove any new or old references.

从错误消息中看来,如果我使用:new.[column_name],那么FOR EACH ROW必须存在。为什么是这样?是否有任何示例在Oracle的FOR EACH ROW中不需要BEFORE INSERT TRIGGER

2 个答案:

答案 0 :(得分:2)

  

是否有任何示例在Oracle的BEFORE INSERT TRIGGER中不需​​要FOR EACH ROW?

语句级别触发器的简单示例:

CREATE TABLE test_table(col VARCHAR2(10));

CREATE OR REPLACE TRIGGER enroll_time
BEFORE INSERT
ON ENROLL
BEGIN
   INSERT INTO test_table(col)
   SELECT 1 FROM dual;
END;
/ 

我强烈建议您阅读compound trigger以了解每个部分何时被解雇。

答案 1 :(得分:1)

基本上,如果您需要使用:OLD或:NEW pseudotables,则需要行级触发器。语句级触发器的一个示例是在另一个表生效时将记录插入表中。