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;
 

你可能感兴趣的:(oracle,工作)