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;