Oracle 中的 BEFORE INSERT TRIGGER 何时不需要 FOR EACH ROW?

Gre*_*uin 5 sql oracle triggers plsql

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

CREATE OR REPLACE TRIGGER enroll_time
BEFORE INSERT
ON ENROLL
FOR EACH ROW
BEGIN
:new.addtime := sysdate;
END;
/ 
Run Code Online (Sandbox Code Playgroud)

如果我删除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.
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*zda 4

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;
/ 
Run Code Online (Sandbox Code Playgroud)

我强烈建议您阅读有关内容compound trigger以了解每个部分何时被触发。