web-dev-qa-db-fra.com

Comment combiner insertion, mise à jour et supprimer dans le même `au lieu de« déclencheur »dans Oracle DB?

Lors de la création d'un Instead Of Déclencheur, le développeur SQL permet d'inclure les 3 actions DML dans le même déclencheur:

enter image description here

Le résultat SQL ressemble à:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF DELETE OR INSERT OR UPDATE ON PO_COSTED_BOM_V 
BEGIN
  NULL;
END;

Je suis capable de combiner Insert et Update comme ceci:

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;
  • Mais comment puis-je obtenir la déclaration Delete dans la gâchette?
  • Comment la gâchette savait-elle quelle action DML a été exécutée?

merci

1
johny why

De codage du corps de déclenchement

Détecter l'opération DML qui a déclenché une gâchette

Si plus d'un type d'opération DML peut déclencher une gâchette (par exemple, sur INSERT OR Supprimer OR de la mise à jour de EMP), le corps de la gâchette peut utiliser les prédicats conditionnels Insertionner, suppression et mise à jour à la vérification. quel type de relevé incendie la gâchette.

Dans le code du corps de la gâchette, vous pouvez exécuter des blocs de code en fonction du type d'opération DML qui a déclenché la gâchette:

IF INSERTING THEN ... END IF;
IF UPDATING THEN ... END IF;
IF DELETING THEN ... END IF;

dans ton cas

...
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;
5
schurik