写了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;