Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Mutationsfehler an nach Insert-Trigger

In Oracle gibt es zwei Ebenen von Triggern:Zeilenebene und Tabellenebene.

Trigger auf Zeilenebene werden for each row ausgeführt . Trigger auf Tabellenebene werden pro Anweisung ausgeführt, selbst wenn eine Anweisung mehr als eine Zeile geändert hat.
In einem Trigger auf Zeilenebene können Sie die Tabelle selbst, die den Trigger enthält, nicht auswählen/aktualisieren:Sie erhalten einen Mutationsfehler.

In diesem Fall ist keine UPDATE-Anweisung erforderlich. Probieren Sie einfach Folgendes aus:

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;
/

BEARBEITEN Rajesh erwähnte, es sei möglich, dass OP vor dem Einfügen einer neuen Zeile alle anderen Datensätze in aso_quote_headers_all aktualisieren möchte Tabelle.

Nun, das ist machbar, aber es ist ein wenig schwierig. Dazu benötigen Sie

  1. Ein pl/sql-Paket und eine Variable im Paket-Header, die von den Triggern modifiziert wird. Diese Variable könnte eine Liste sein, die die IDs von neu eingefügten Datensätzen enthält. Auf Zeilenebene nach dem Insert-Trigger würde der Liste eine neue ID hinzugefügt. Der Inhalt dieser Paketvariablen ist für jede Sitzung unterschiedlich, also nennen wir diese Variable session_variable .
  2. Zeilenebene nach dem Insert-Trigger, der der session_variable eine neue ID hinzufügen würde .
  3. Tabellenebene nach dem Insert-Trigger, der IDs aus der session_variable erhalten würde , verarbeiten Sie die ID und entfernen Sie sie dann aus der session_variable . Dieser Trigger könnte notwendige Auswahlen/Aktualisierungen auf aso_quote_headers_all ausführen. Nachdem eine neu eingefügte ID verarbeitet wurde, sollte dieser Trigger sicherstellen, dass sie aus der session_variable entfernt wird .