oracle 触发器update 出现ORA-04091: 表 **发生了变化, 触发器/函数不能读它
·
出现这种错误的原因是:如果一个触发器定义在表a上,那么在触发器被触发的过程中 表a 是被锁定的,就连读取都不可以。
错误实例:
create or replace trigger checkUpdateExpertCertificate before update on expert_certificate for each row
declare
num int;
myexp exception;
begin
select count(*) into num from expert_certificate ;
if num>0 then
raise myexp;
end if;
exception
when myexp then raise_application_error('-20002', '证书类型互斥' );
end checkUpdateExpertCertificate;
上面只是计算一下表的列数,但是任然报错。
解决办法:
create or replace trigger checkUpdateExpertCertificate before update on expert_certificate for each row
declare
num int;
myexp exception;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
select count(*) into num from expert_certificate ;
if num>0 then
raise myexp;
end if;
exception
when myexp then raise_application_error('-20002', '证书类型互斥' );
COMMIT;
end checkUpdateExpertCertificate;
结果:
我的表中是有数据的,可以看到,我设置的异常被正常触发了。
多加了:
PRAGMA AUTONOMOUS_TRANSACTION; COMMIT;
更多推荐
所有评论(0)