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