INSERT-trigger für das einfügen von Datensatz in der gleichen Tabelle
Ich habe einen trigger, der das Feuer auf einfügen eines neuen Datensatzes in der Tabelle in dieser möchte ich einfügen neuen Datensatz in der gleichen Tabelle.
Mein trigger ist :
create or replace trigger inst_table
after insert on test_table referencing new as new old as old
for each row
declare
df_name varchar2(500);
df_desc varchar2(2000);
begin
df_name := :new.name;
df_desc := :new.description;
if inserting then
FOR item IN (SELECT pid FROM tbl2 where pid not in(1))
LOOP
insert into test_table (name,description,pid) values(df_name,df_desc,item.pid);
END LOOP;
end if;
end;
seine geben, ein Fehler wie
ORA-04091: table TEST_TABLE is mutating, trigger/function may not see it
ich denke, dass es verhindert, dass mir zum einfügen in die gleiche Tabelle.
also, wie kann ich das einfügen dieses neuen Datensatz in der gleichen Tabelle.
Hinweis :- ich bin mit Oracle-Datenbank
mögliche Duplikate von Oracle-Trigger - problem mit mutating tables
InformationsquelleAutor Yagnesh Agola | 2011-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mutation passiert, Sie haben jederzeit ein row-level trigger, der ändert die Tabelle, die Sie auslösen. Das problem ist, dass Oracle kann nicht wissen, wie man sich zu Verhalten hat. Fügen Sie eine Zeile, die den trigger selbst fügt eine Zeile in die gleichen Tisch, und Oracle verwechselt wird, verursachen, werden diese Einfügungen in die Tabelle aufgrund der auslösen, sind Sie vorbehaltlich der trigger-Aktion zu?
Die Lösung ist ein drei-Schritt-Prozess.
1.) Anweisung level before-trigger, die erzeugt ein Paket, das wird verfolgen der Zeilen eingefügt wird.
2.) Row-level vor oder nach dem trigger, speichert diese Zeile info in der Paket-Variablen instanziiert wurden in der vorherigen Schritt.
3.) Statement-level-after-trigger, der inserts in die Tabelle alle Zeilen, die gespeichert werden, in der Paket-variable.
Ein Beispiel dafür finden Sie hier:
http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
Hoffe, das hilft.
InformationsquelleAutor Mark J. Bobak
Ich würde sagen, Sie sollten sich auf ANDERE Weise als Trigger um dies zu erreichen. Wie bereits in der Antwort von Mark Steppen, die trigger einfügen einer Zeile und dann für jede Zeile eingefügt, die durch den trigger, das dann aufrufen muss, den trigger zum einfügen von mehreren Zeilen.
Ich würde schauen, entweder schriftlich eine gespeicherte Prozedur zu erstellen, die fügen oder legen Sie einfach über eine sub-Abfrage, anstatt von Werten.
Trigger können verwendet werden, einfache Probleme zu lösen, aber bei der Lösung komplizierter Probleme, die Sie nur Kopfschmerzen verursachen.
Es wäre lesenswert durch die Antworten auf diese doppelte Frage gepostet von APC und auch diese dieser Artikel von Tom Kyte. BTW, der Artikel ist auch auf die in der doppelten Frage aber der link ist inzwischen veraltet.
InformationsquelleAutor Mike Meyers
Obwohl nach Klagen darüber, wie schlecht die Auslöser sind, hier ist eine andere Lösung.
Vielleicht müssen Sie sich mit zwei Tabellen. Einfügen der Daten in die
test_table
Tisch, als Sie derzeit tun. Aber anstatt den trigger fügen Sie zusätzliche Zeilen in dietest_table
Tabelle, haben eine detail-Tabelle mit den Daten. Der trigger kann dann legen Sie alle erforderlichen Zeilen in der detail-Tabelle.Können Sie wieder die Begegnung mit der mutating trigger-Fehler, wenn Sie eine delete cascade foreign key-Beziehung zwischen zwei Tabellen so könnte es am besten zu vermeiden.
InformationsquelleAutor Mike Meyers