ORA-04091:テーブルXXが変化し、トリガー/関数が読めなくなった
triggerと書いてありますが、コードは以下の通りです.
create or replace trigger sync_nas_failReason_trigger
/**
** :
** :spjk , nas wo remarks ,
**created by zdp @ 2010/6/23
**/
after update on spjk_table
for each row
declare
woNbr varchar2(512);
backfillFlag varchar2(512);
spjkErrMsg varchar2(512);
woRemarks wo.remarks%type; --wo
tempInfo varchar2(512); -- wo
begin
--1. spjk
select st.wo_nbr, st.backfill_flag, st.err_msg
into woNbr, backfillFlag, spjkErrMsg
from spjk_table st
where st.spjk_id = :new.spjk_id;
--2. Y ,
if backfillFlag ='Y' then
-- wo
select wo.remarks into woRemarks from wo where wo.wo_nbr =woNbr;
--
tempInfo :=substr(woRemarks||'==>'||spjkErrMsg,1,512);
--dbms_output.put_line( 'tempInfo='||tempInfo);
--
update wo set wo.remarks =tempInfo where wo.wo_nbr =woNbr;
end if;
end sync_nas_failReason_trigger;
実行時にエラーが発生しました.以下のようにします.
ORA-04091:テーブルXXが変化し、トリガー/関数が読めなくなった
問題の原因:
プロセスで使用する:new.spjk_idは再びターゲットテーブルを調べて、この動作はoracleに合法的ではないとされています.
--1. spjk
select st.wo_nbr, st.backfill_flag, st.err_msg
into woNbr, backfillFlag, spjkErrMsg
from spjk_table st
where st.spjk_id = :new.spjk_id;
問題解決:
現在の記録を取得したい情報は直接使用します:new.操作すればいいのに、oracleはこのメカニズムを提供しています.なぜ曲がりくねっているのでしょうか.上のクエリーは余計で、結果的にエラーを招きました.
正しい手順は次のとおりです.
create or replace trigger sync_nas_failReason_trigger
/**
** :
** :spjk , nas wo remarks ,
**created by zdp @ 2010/6/23
**/
after update on spjk_table
for each row
declare
woRemarks wo.remarks%type; --wo
tempInfo varchar2(512); -- wo
begin
-- Y ,
if :new.backfill_flag ='Y' then
-- wo
select wo.remarks into woRemarks from wo where wo.wo_nbr =:new.wo_nbr;
--
tempInfo :=substr(woRemarks||'==>'||:new.err_msg,1,512);
--dbms_output.put_line( 'tempInfo='||tempInfo);
--
update wo set wo.remarks =tempInfo where wo.wo_nbr =:new.wo_nbr;
end if;
end sync_nas_failReason_trigger;