Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur de mutation après le déclencheur d'insertion

Dans oracle, il existe deux niveaux de déclencheurs :au niveau de la ligne et au niveau de la table.

Les déclencheurs au niveau de la ligne sont exécutés for each row . Les déclencheurs au niveau de la table sont exécutés par instruction, même si une instruction a changé de plus d'une ligne.
Dans un déclencheur au niveau de la ligne, vous ne pouvez pas sélectionner/mettre à jour la table elle-même qui a le déclencheur :vous obtiendrez une erreur de mutation.

Dans ce cas, il n'est pas nécessaire d'utiliser une instruction UPDATE. Essayez ceci :

CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
 :new.quote_expiration_date=sysdate+90;     
END;
/

MODIFIER Rajesh a mentionné qu'il est possible qu'avant d'insérer une nouvelle ligne, OP veuille mettre à jour tous les autres enregistrements dans le aso_quote_headers_all tableau.

Eh bien, c'est faisable, mais c'est un peu délicat. Pour le faire correctement, vous aurez besoin de

  1. Un package pl/sql et une variable dans l'en-tête du package qui est modifié par les déclencheurs. Cette variable peut être une liste contenant les identifiants des enregistrements nouvellement insérés. Le niveau de ligne après le déclencheur d'insertion ajouterait un nouvel ID à la liste. Le contenu de cette variable de package sera différent pour chaque session différente, appelons donc cette variable session_variable .
  2. Niveau de ligne après le déclencheur d'insertion, cela ajouterait un nouvel ID à la session_variable .
  3. Niveau de la table après le déclencheur d'insertion qui obtiendrait les ID de la session_variable , traitez l'ID puis supprimez-le de la session_variable . Ce déclencheur pourrait exécuter les sélections/mises à jour nécessaires sur aso_quote_headers_all. Après le traitement d'un ID nouvellement inséré, ce déclencheur doit s'assurer qu'il est supprimé de la session_variable .