我刚开始学习触发器。我想制作一个触发器,在插入测试后给用户一个通知'成功插入'。
这是我的代码。
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;
/
答案 0 :(得分:0)
您的代码不完整。 CREATE TABLE上缺少“)”。 推杆拼写错误。它应该是PUT_LINE。
在触发器中使用DBMS_OUTPUT是一个非常糟糕的主意。用户可能正在使用不能或不能处理DBMS_OUTPUT的客户端(与sqlplus不同)
答案 1 :(得分:0)
将after
替换为before
,如下所示,表格也需要')'丢失。
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
/
答案 2 :(得分:0)
只有在打开它时才会显示输出(SQL Plus,SQL Developer):
在
上设置serveroutput