您的位置:首页 > 数据库 > Oracle

oracle 触发器update 出现ORA-04091: 表 **发生了变化, 触发器/函数不能读它

2017-04-08 14:04 507 查看
出现这种错误的原因是:如果一个触发器定义在表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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐