2017-10-13 2 views
-1

Ich habe gerade angefangen zu lernen, Trigger. Und ich möchte einen Trigger machen, der nach dem Einfügen in den Test den Hinweis "erfolgreich einfügen" gibt.Orakel-Trigger-Druck nach dem Einfügen

Hier ist mein Code.

create table test (id number, name varchar2(30)); 

create trigger tr_test 
after insert on test 
for each row 
begin 
dbms_output.put_line('insert successfully'); 
end; 
/

insert into test values(1, 'john'); 

Und ich bekomme die Fehlermeldung wie folgt aus:

ERROR at line 1: 
ORA-04091: table YUFENG.TEST is mutating, trigger/function may not see it 
ORA-06512: at "YUFENG.TR_TEST", line 3 
ORA-04088: error during execution of trigger 'YUFENG.TR_TEST' 

Könnte jemand den Fehler hinweisen und sagen Sie mir, wie Sie den Code ändern?


Sorry, dass ich nicht feststellen, dass es viele einfache Fehler, die die Abfrage nicht in der Lage zu laufen macht. Und mein ursprünglicher Code deklariert Variable im Trigger, aber ich habe sie nicht gepostet. Ich denke, wahrscheinlich ist das der Grund, warum ich den Fehler mutiere.

CREATE or REPLACE TRIGGER TR_TEST 
AFTER INSERT ON TEST 
FOR EACH ROW 
DECLARE a VARCHAR2(30); 
BEGIN 
SELECT ID INTO a FROM TEST WHERE ID=:NEW.ID; 
DBMS_OUTPUT.PUT_LINE('insert successfully'); 
END; 
/
+1

Es gibt nichts im geposteten Code, der dazu führen würde, dass der Auslöser mutiert. Klar, das ist nicht der Code, den du führst. Worum geht es also? Muting-Tabelle Fragen sind ziemlich häufig auf dieser Website. Eine einfache Suche nach ORA-04091 ergibt buchstäblich Hunderte von Treffern. – APC

+0

Vielen Dank für die Antwort. Das Problem meines ursprünglichen Codes ist wahrscheinlich dasselbe wie eine mutierende Tabellenfrage. – yufeng

Antwort

0

Ihr Code ist unvollständig. Auf der CREATE TABLE fehlt ein ")". Die Putline ist falsch geschrieben. Es sollte PUT_LINE sein.

Es ist eine extrem schlechte Idee, DBMS_OUTPUT in einem Trigger zu verwenden. Ein Benutzer kann einen Client verwenden, der DBMS_OUTPUT nicht verarbeiten kann oder nicht (im Gegensatz zu sqlplus)

0

Ersetzen Sie after durch before wie unten, auch die Tabelle 'fehlt'.

create table test (id number, name varchar2(30)); 


create or replace trigger tr_test 
before insert on test 
for each row 
begin 
dbms_output.put_line('insert successfully'); 
end; 
/

auch seine gute Idee, die Sie bestimmte Spalten im Einsatz

insert into test (id,name) values(1, 'john') 
/
commit 
/
0

der Ausgang wird nur angezeigt, wenn Sie es einschalten (SQL Plus SQL Developer):

set serveroutput on

Verwandte Themen