0

我收到语句的变异表错误insert into employee select 'xyz',200 from dual,并且脚本成功执行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'
4

1 回答 1

0

插入单行不会导致变异表错误 - 怎么可能,因为该行以前不存在?

但是 insert-select 可能涉及不止一行,因此您会收到错误消息。

通常,您的触发器中不应有非查询 DML 操作。太多可能的副作用和不良后果。

更好的方法是编写一个为您执行插入的过程,不要直接在表上授予插入权限,只授予拥有该过程的包。然后在该过程中,您可以在插入之前进行删除,或者您可以进行合并 - 或其他任何方式。

所有逻辑都隐藏在过程中,通过限制表上的权限,您可以确保必须调用过程。

希望有帮助!

于 2019-04-26T19:40:10.033 回答