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
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
21579 次 |
| 最近记录: |