日期:2014-05-16  浏览次数:20491 次

ORA-04091 表发生了变化,触发器/函数不能读

问题描述:在函数中查询某张表前对表做了更新和插入操作,使表数据发生了变化,而函数返回的数据已经发生变化,导致出错.

?

如果在触发器中调用了存储过程,并且在触发器中对表A进行了更新,然后又在存储过程中对表A进行了插入,如此操作就会导致该问题的产生。

?

解决方案:尽量调整操作的方法,一步到位,不要做两个更新操作。

解决办法:在函数BEGIN之前加入一个自治事务pragma autonomous_transaction;

并且在END之前提交commit;

就OK了...

其中PRAGMA关键字通知PL/SQL编译器,将声明它的这个PL/SQL代码块分割为一个自治的或独立的事务.

例如:
function fun_Getxx(i_input varType)

return varType is Result varType;

pragma autonomous_transaction;

begin

??????? ……

??????? ……
??????? return Result;

???????commit;

end;