INSERT触发器,用于在同一个表中插入记录

Yag*_*ola 2 oracle triggers insert mutating-table

我有一个触发器,因为我想在同一个表中插入新记录,因此在表中插入新记录时会触发.
我的触发器是:

create or replace trigger inst_table
after insert on test_table referencing new as new old as old  
for each row
declare 
      df_name varchar2(500);
      df_desc varchar2(2000);

begin
      df_name := :new.name;
      df_desc := :new.description;

     if inserting then
          FOR item IN (SELECT pid FROM tbl2 where pid not in(1))
             LOOP
                 insert into test_table (name,description,pid) values(df_name,df_desc,item.pid); 
             END LOOP;    
     end if; 
end;
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误

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

我认为它阻止我插入到同一个表中.
那我怎么能把这个新记录插入到同一个表中.

注意: - 我使用Oracle作为数据库

Mar*_*bak 10

只要您有一个行级触发器来修改您正在触发的表,就会发生变异.问题是,Oracle无法知道如何表现.你插入一行,触发器本身会在同一个表中插入一行,而Oracle会因为触发而导致那些插入到表中,它们是否也受到触发操作的影响?

该解决方案分为三个步骤.

1.)触发器之前的语句级别,实例化将跟踪正在插入的行的包.

2.)行触发器之前或之后的行级别,将行信息保存到上一步中实例化的包变量中.

3.)插入表中的触发器之后的语句级别,保存在包变量中的所有行.

这方面的一个例子可以在这里找到:

http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936

希望有所帮助.