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;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值