2017-10-13 122 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开发者):

设置服务器输出