出现这种错误的原因是:如果一个触发器定义在表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;   


Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐