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;