转:http://zzq0341.javaeye.com/blog/806300
行级触发器对当前表操作,”ORA-04091: 表 COMPANY 发生了变化,触发器/函数不能读它“,解决方法
文章分类:数据库今天在写一个触发器的时候,发现在当前表的行级触发器里,对当前表进行查询报一下错误:ORA-04091: 表 COMPANY 发生了变化, 触发器/函数不能读它。
上网查了一会,解决办法还挺难找,不过还是找到了。在这分享个大家,希望大家能顺利解决这种问题。触发器语句如下:
create or replace trigger TR_U_ID_SYNCH
declare
tId
PRAGMAAUTONOMOUS_TRANSACTION;
begin
if :new_value.U_ID is not null and :new_value.U_ID!=
![行级触发器对当前表操作,鈥漁RA-04091: <wbr>表 <wbr>COMPANY <wbr>发生了变化, <wbr>触发器/函数不能读它鈥湥饩龇椒 行级触发器对当前表操作,鈥漁RA-04091: <wbr>表 <wbr>COMPANY <wbr>发生了变化, <wbr>触发器/函数不能读它鈥湥饩龇椒](http://zzq0341.javaeye.com/images/smiles/icon_surprised.gif)
end if;
COMMIT;
end TR_CO_GB_ID_SYNCH;
主要是加了红色部分,问题才解决!
如果是在触发器里面调用程序包里面的函数,那么把这两句放到函数里面。不用放在触发器里面。
一个写日志的例子:
Procedure DeleteCQYWInPublicDB(v_YWH In Varchar2) as
sOPLog varchar2(4000);
/* iCount integer;*/
iOPFlag integer;
iOPTYPE integer := 4;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
delete from shis_cq_land@WSBAPUBLIC t1 where t1.PROPERTYID=v_YWH;
delete from SHIS_CQ_OWNER@WSBAPUBLIC t1 where t1.PROPERTYID=v_YWH;
delete from SHIS_CQ_PROPERTY@WSBAPUBLIC t1 where t1.id=v_YWH;
delete from SHIS_CQ_ROOM@WSBAPUBLIC t1 where t1.PROPERTYID=v_YWH;
commit;
Exception
When Others Then
sOPLog := 'errinfo:' || sqlerrm;
--出错,写错误日志
iOPFlag := 0;
insert into LOG_DATAEXCHANGE
(ywh, Flag, CONTENT, OPType)
values
(v_YWH, iOPFlag, sOPLog, iOPType);
commit;
end DeleteCQYWInPublicDB;
注意上面加粗红色的两个commit。因为这个过程是放在一个事务里面运行的,如果不加第二个commit,就写不上错误日志,而且上一级的事务也会报错!