2017-10-13 119 views
-1

我剛開始學習觸發器。我想在插入測試後給用戶一個通知'插入成功'。插入後oracle觸發器打印

這是我的代碼。

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上有一個缺失的「)」。 拼音輸入拼寫錯誤。它應該是PUT_LINE。

在觸發器中使用DBMS_OUTPUT是一個非常糟糕的主意。用戶可以使用不能或不處理DBMS_OUTPUT(不像SQLPLUS)的客戶端

0

替換afterbefore如下,也是表需要「)」缺失。

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開發者):

設置服務器輸出