2016-06-15 6 views
0

Ich versuche, einen Trigger zu erstellen, der den Wert aus einer Spalte ("nubes" in eine andere ("nubuesleft") der gleichen Tabelle kopiert, wenn eine neue Zeile hinzugefügt wird . richtig zusammengestellt, aber wenn ich eine neue Zeile einzufügen, wirft er einen FehlerSQL-Trigger kompiliert korrekt, aber Fehler

Meine Trigger ist:

create or replace TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
AFTER INSERT ON SAMPLES FOR EACH ROW BEGIN 
update samples 
set notubesleft = (select notubes from samples where sampleid = :new.sampleid); 
END; 

wenn ich versuche, eine neue Zeile zu begehen erhalte ich die Fehlermeldung:

One error saving changes to table "APEX_WS_PROMETHEUS"."SAMPLES":
Row 10: ORA-04091: table APEX_WS_PROMETHEUS.SAMPLES is mutating, trigger/function may not see it
ORA-06512: at "APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER", line 2 ORA-04088: error during execution of trigger 'APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER'
ORA-06512: at line 1

Ich frage ein neues q Da ich Lösungen finden könnte, um den PL/SQL-Code des Triggers zu strukturieren, kann ich nicht herausfinden, warum das nicht funktioniert.

Danke.

+0

Warum Sie versuchen, dies mit einem After-Insert-Trigger zu tun? –

+0

Weil ich dachte, dass ich zuerst die Werte in die Tabelle einfügen musste, bevor ich sie verwenden konnte, um eine andere Spalte zu füllen. Es ist mein erster Auslöser. – Matte

Antwort

1

in eine FOR EACH ROW-Trigger mutiert können Sie nicht (leicht) abfragen, um die Tabelle Sie Einfügen in eine Reihe- Level-Trigger. Aber Sie sollten die Tabelle überhaupt nicht abfragen und sollten dafür keinen After-Insert-Trigger verwenden. Verwenden Sie stattdessen einen Trigger vor dem Einfügen; Sie können die Werte aus dem :NEW pseudorecord erhalten und setzen:

CREATE OR REPLACE TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
BEFORE INSERT ON SAMPLES FOR EACH ROW 
BEGIN 
    :new.notubesleft := :new.notubes; 
END; 
+0

Das funktioniert wie ein Zauber! Danke vielmals – Matte

0

Sie haben ein Problem mit mutierenden Tabellen festgestellt. Es gibt eine Einschränkung, dass Sie nicht eine Tabelle abfragen, die

Trigger Restrictions on Mutating Tables

If you must update a mutating table, you can bypass these restrictions by using a temporary table, a PL/SQL table, or a package variable. For example, in place of a single AFTER row trigger that updates the original table, resulting in a mutating table error, you might use two triggers—an AFTER row trigger that updates a temporary table, and an AFTER statement trigger that updates the original table with the values from the temporary table.

+0

Danke für die Hilfe. Ich frage mich auch, ob das FÜR JEDE REIHE richtig ist. Mein Ziel ist es, nur den Trigger für die neue Zeile auszuführen, die eingefügt wird. Ich erwarte, dass Benutzer nur jeweils eine Zeile einfügen. – Matte

Verwandte Themen