2017-10-13 20 views
-1

トリガーの学習を始めたばかりです。そして、私はテスト後に挿入すると、ユーザーに「挿入を成功させる」という通知を与えるトリガーを作りたい。挿入後のオラクル・トリガー・プリント

ここに私のコードです。

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'); 

そして、私はこのようなエラーが出ます:

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' 

誰がエラーを指摘し、どのようにコードを変更する方法を教えてもらえますか?


申し訳ありませんが、私は、クエリを実行できないような単純な間違いがたくさんあることに気付きませんでした。そして、私の元のコードはトリガで変数を宣言しますが、投稿しませんでした。私はおそらくそれがエラーを突然変異させる理由だと思います。

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

投稿コードには、トリガの原因となるものは何もありません。明らかにこれは実行しているコードではないので、何がポイントですか?突然変異のテーブルの質問は、このサイトではかなり一般的です。 ORA-04091を簡単に検索すると、文字通り数百のヒットが返されます。 – APC

+0

ありがとうございます。私の元のコードの問題はおそらくテーブルの質問を変更することと同じです。 – yufeng

答えて

0

コードが不完全です。 CREATE TABLEに ")"がありません。 putlineのスペルが間違っています。それはPUT_LINEでなければなりません。

トリガーでDBMS_OUTPUTを使用することは非常に悪い考えです。ユーザーが「)」

0

もテーブルが必要、以下のようにbeforeafterを交換するか(sqlplusとは異なり)DBMS_OUTPUTを処理しないことができないクライアントを使用している可能性が不足しています。また

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

その良いアイデアあなたインサート内の特定の列

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

あなたは(SQL プラス、SQL開発者)に電源を入れた場合、出力にのみ、表示されます。

set serveroutput

関連する問題