如何在 Oracle db 中的同一个 `Instead Of` 触发器中组合插入、更新和删除?

joh*_*why 1 trigger oracle plsql dml

创建Instead Of触发器时,Sql Developer 允许在同一个触发器中包含所有 3 个 DML 操作:

在此处输入图片说明

结果 SQL 如下所示:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF DELETE OR INSERT OR UPDATE ON PO_COSTED_BOM_V 
BEGIN
  NULL;
END;
Run Code Online (Sandbox Code Playgroud)

我能够结合InsertUpdate喜欢这样的:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF INSERT OR UPDATE OR DELETE ON PO_COSTED_BOM_V 
BEGIN
  UPDATE SRC_TBL SET CFG_VALUE = :NEW.CFG_VALUE
  WHERE CFG_NAME = :NEW.CFG_NAME;
  IF SQL%NOTFOUND THEN
      INSERT INTO SRC_TBL (CFG_NAME, CFG_VALUE) 
         VALUES(:NEW.CFG_NAME, :NEW.CFG_VALUE);
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)
  • 但是如何将Delete语句放入触发器中?
  • 触发器如何知道执行了哪个 DML 操作?

谢谢

小智 5

编码触发器主体

检测触发触发器的 DML 操作

如果不止一种类型的 DML 操作可以触发触发器(例如,ON INSERT OR DELETE OR UPDATE OF emp),触发器主体可以使用条件谓词 INSERTING、DELETING 和 UPDATING 来检查触发触发器的语句类型。

在触发器主体的代码中,您可以根据触发触发器的 DML 操作类型执行代码块:

IF INSERTING THEN ... END IF;
IF UPDATING THEN ... END IF;
IF DELETING THEN ... END IF;
Run Code Online (Sandbox Code Playgroud)

在你的情况下

...
if inserting then

INSERT INTO SRC_TBL (CFG_NAME, CFG_VALUE) 
         VALUES(:NEW.CFG_NAME, :NEW.CFG_VALUE);

elsif updating then

 UPDATE SRC_TBL SET CFG_VALUE = :NEW.CFG_VALUE
  WHERE CFG_NAME = :NEW.CFG_NAME;

elsif deleting then

 ...

END IF;
Run Code Online (Sandbox Code Playgroud)