• ORA-04091: table xxx is mutating, trigger/function may not see it


    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
    Connected as tbcs
     
    SQL> 
    SQL> 
    SQL> drop trigger tbcs.TRG_CJW_TEST;
     
    drop trigger tbcs.TRG_CJW_TEST
     
    ORA-04080: trigger 'TRG_CJW_TEST' does not exist
    SQL> drop table tbcs.cjw_test;
     
    drop table tbcs.cjw_test
     
    ORA-00942: table or view does not exist
    SQL> create table cjw_test
      2  (
      3  itemid1    varchar2(10),
      4  itemid2    varchar2(10),
      5  itemid3    varchar2(10)
      6  );
     
    Table created
    SQL> insert into cjw_test values('1','1','1');
     
    1 row inserted
    SQL> commit;
     
    Commit complete
    
    /*
    对于after 类型的 for each row 级别的triggers,不论哪种insert语句触发了trigger,
    都不允许在 trigger 中访问本trigger所依赖的table的
    */
    
    SQL> create or replace trigger trg_cjw_test
      2    after insert on tbcs.cjw_test
      3    for each row
      4  declare
      5    i   number:=0;
      6  begin
      7    select count(1) into i from tbcs.cjw_test;
      8  end trg_cjw_test;
      9  /
     
    Trigger created
     
    SQL> insert into cjw_test values('1','1','1');
     
    insert into cjw_test values('1','1','1')
     
    ORA-04091: table TBCS.CJW_TEST is mutating, trigger/function may not see it
    ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
    ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
     
    SQL> 
    SQL> 
    /*
    对于before 类型的 for each row 级别的triggers,如果使用 insert into ... values 语句触发此trigger ,
    则在trigger 中访问本table没有问题;但如果使用 insert into select .. from 语句触发此trigger ,
    则在trigger 中访问本table就报ora-04091错误;
    */
    
    SQL> create or replace trigger trg_cjw_test
      2    before insert on tbcs.cjw_test
      3    for each row
      4  declare
      5    i   number:=0;
      6  begin
      7    select count(1) into i from tbcs.cjw_test;
      8  end trg_cjw_test;
      9  /
     
    Trigger created
     
    SQL> insert into cjw_test values('1','1','1');
     
    1 row inserted
     
    SQL> commit;
     
    Commit complete
     
    SQL> 
    SQL> create or replace trigger trg_cjw_test
      2    before insert on tbcs.cjw_test
      3    for each row
      4  declare
      5    i   number:=0;
      6  begin
      7    insert into tbcs.cjw_test
      8    select '2','2','2' from dual;
      9  end trg_cjw_test;
     10  /
     
    Trigger created
     
    SQL> insert into cjw_test values('1','1','1');
     
    insert into cjw_test values('1','1','1')
     
    ORA-04091: table TBCS.CJW_TEST is mutating, trigger/function may not see it
    ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
    ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
    ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
    ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
     
    SQL> 
    
     SQL> 
    /*
    上面实验中使用before,我们在仅插入一条数据的情况下,并没有报错,现在试一下插入多条数据的情况
    */
    SQL> create or replace trigger trg_cjw_test
      2    before insert on tbcs.cjw_test
      3    for each row
      4  declare
      5    i   number:=0;
      6  begin
      7    select count(1) into i from tbcs.cjw_test;
      8  end trg_cjw_test;
      9  /
     
    Trigger created
     
    SQL> 
    SQL> create table cjw_test_bak as select * from cjw_test;
     
    Table created
    SQL> insert into cjw_test_bak values('2','1','1');
     
    1 row inserted
    SQL> insert into cjw_test_bak values('3','1','1');
     
    1 row inserted
    SQL> insert into cjw_test_bak values('4','1','1');
     
    1 row inserted
     
    SQL> commit;
     
    Commit complete
     
    SQL> insert into cjw_test select * from cjw_test_bak;
     
    insert into cjw_test select * from cjw_test_bak
     
    ORA-04091: table TBCS.CJW_TEST is mutating, trigger/function may not see it
    ORA-06512: at "TBCS.TRG_CJW_TEST", line 4
    ORA-04088: error during execution of trigger 'TBCS.TRG_CJW_TEST'
     
    SQL> 
  • 相关阅读:
    提取字符串中的数字
    监控mysql执行的sql语句
    maven打包跳过单元测试
    idea常用快捷键
    spring boot 从入门到精通(一)启动项目的三种方式
    git从入门到精通(三)(git 生成本地密钥的方法:windows)
    经典面试题
    vue 20道精选面试题
    Angular输入框内按下回车会触发其它button的点击事件的解决方法
    快速搭建angular7 前端开发环境
  • 原文地址:https://www.cnblogs.com/dingyingsi/p/3358675.html
Copyright © 2020-2023  润新知