【问题标题】:oracle trigger print after insert [duplicate]插入后oracle触发打印[重复]
【发布时间】:2018-03-25 04:34:12
【问题描述】:

我刚开始学习触发器。我想制作一个触发器,在插入测试后给用户一个“插入成功”的通知。

这是我的代码。

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

【问题讨论】:

  • 发布的代码中没有任何内容会导致触发器发生变异。显然这不是您正在运行的代码,那么有什么意义呢?变异表问题在这个网站上相当普遍。对 ORA-04091 的简单搜索会返回数百个匹配项。
  • 感谢您的回复。我原代码的问题大概和mutating table question一样。

标签: oracle


【解决方案1】:

您的代码不完整。 CREATE TABLE 上缺少“)”。 putline 拼写错误。应该是 PUT_LINE。

在触发器中使用 DBMS_OUTPUT 是一个非常糟糕的主意。用户可能正在使用无法或不处理 DBMS_OUTPUT 的客户端(与 sqlplus 不同)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      只有在开启时才会显示输出(SQLPlus、SQLDeveloper):

      设置服务器输出

      【讨论】:

        猜你喜欢
        • 2012-03-30
        • 2017-08-10
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        相关资源
        最近更新 更多