【发布时间】:2019-09-15 21:08:47
【问题描述】:
对于语句 insert into employee select 'xyz',200 from dual,我收到 mutating table error 并且脚本为 insert into employee values ('abc',100); 成功执行。
有人可以解释为什么该语句对于一种类型的插入语句会失败吗?两个脚本都将相似类型的数据插入到表中
脚本详情:
--table creation
create table employee (name varchar2(30),salary number);
--trigger creation
create or replace trigger emp_trig
before insert on employee
for each row
begin
delete from employee where name=:new.name;
end;
/
--insert statement 1
insert into employee values ('abc',100);
--result : 1 row inserted
--insert statement 2
insert into employee select 'xyz',200 from dual
--result:
Error report -
ORA-04091: table NMS_CON.EMPLOYEE is mutating, trigger/function may not see it
ORA-06512: at "NMS_CON.EMP_TRIG", line 2
ORA-04088: error during execution of trigger 'NMS_CON.EMP_TRIG'
【问题讨论】:
-
这纯粹是出于好奇,还是您试图实现的生产代码示例?因为如果是后者,不要使用触发器,而是使用merge语句而不是insert语句!
-
在生产代码中遇到了一些问题。在对此进行一些研究时,我最终得出了上述疑问。所示示例仅用于说明目的
-
一般来说,对于定义触发器的每一行触发器,您应该避免触及 a 内的同一个表。
-
是的,但触发器在第一次查询时工作正常。
-
触发器是否适用于
insert ... values...语句并不重要,它是否适用于insert ... select ...语句。避免这种触发“解决方案”,并寻求通过不同的解决方案来实现您的目标。
标签: plsql triggers mutating-table