Wie Sie das update nach dem insert in die gleiche Tabelle in einer Oracle-trigger?
Ich habe eine Tabelle mit den Spalten X, Y und Z. ich will set Z, wenn ich einfügen oder aktualisieren von X und Y, also Z=X*Y, verwenden Sie einen trigger.
create or replace trigger tr_tab
after insert
on tab
for each row
begin
update tab
set z=x*y;
end;
/
Aber nach dem insert bekomme ich eine Fehlermeldung.
- es ist hilfreich, um den Fehler, den Sie bekommen - vermutlich ein mutating table error hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht (und können nicht, im Allgemeinen) aktualisieren Sie die Zeile, die Sie einfügen; Sie müssen sich ändern, was wird eingefügt, indem die neue Z-Wert für die aktuelle Zeile:
Dies bezieht sich auf die eingefügten/aktualisierten Zeilen mit die
:new
- syntax pseudorecord.Dieser muss einen vor-insert-trigger zu manipulieren, die
:new
Wert für eine Spalte; ein after-insert-for-each-row-trigger feuert zu spät, um das zu ändern.Könnte man eine after-insert-Anweisung-level-trigger, d.h. das, was Sie zeigten in der Frage, aber mit der
for each row
Linie entfernt - aber das würde zu aktualisieren, Z für jede Zeile in der Tabelle, auch wenn sich nichts geändert hätte, tun viel mehr Arbeit und erzeugen unnötig wiederholen. (Lesen Sie mehr über die trigger-Typen in der Dokumentation).Haben Sie auch die Möglichkeit, die Z eine virtuelle Spalte, die automatisch generiert aus den Werten anderer Spalten, ohne dass ein Auslöser.
:=
für PL/SQL-Zuordnung. Behoben.for each row
- aber das würde eine Neuberechnung der Werte für alle Zeilen, die nicht notwendig)Haben Sie zum verweisen auf den neu eingefügten Werten zu tun, die
Und wenn Sie wollen, um den Unterschied zwischen Einfügungen und Aktualisierungen Sie können es so machen:
Alle Informationen die Sie benötigen, um erstellen Sie Ihre trigger ist auf dieser Seite:
http://docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_tr.htm