ORA-04091:表XX发生了变化,触发器/函数不能读它

 

 /**  

  **名称:修改单,QC同步触发器 

  **功能:修改单修改后,QC信息同步 ,以提供前台展现  

  **created by fanqd @ 2010/12/26 

  **/ 

 

create or replace trigger modifysynchronizeqc

  after update on tb_support_modify

   Referencing  old as old new as newValue

  for each row

 

declare

  var_out1 VARCHAR(255);

  var_out2 VARCHAR(255);

BEGIN

  SELECT u.objname INTO var_out1 FROM tb_support_userinfo u WHERE u.objno=:newValue.MODIFIER;

  SELECT v.MODULE_NAMES INTO var_out2 FROM vw_modify_active v WHERE v.MODIFY_ID=:newValue.MODIFY_ID;

   UPDATE DEFAULT_质保单导入测试_.Req@QC114 t  

   SET t.RQ_USER_25 = '修改原因:'||:newValue.MODIFY_REASON||'/n 修改说明:'||:newValue.MODIFY_DESC||'/n    修改文件及路径:'||:newValue.MODIFY_FILE||:newValue.PROGRAM_PATH||'/n 修改表结构信息:'||:newValue.TABLE_MODIFY

   , --修改信息

   t.RQ_USER_26 = :newValue.SELF_TEST_DESC,   --单元测试记录

   t.RQ_USER_27 = '测试要点及建议:'||:newValue.TEST_SUGGESTION||'/n 上线步骤:'||:newValue.PUBLISH_DESC,  

   --测试要点及上线步骤

   t.RQ_REQ_TYPE = decode(:newValue.TEST_TYPE,1,'现场测试','测试室测试'),

   t.RQ_USER_04 = var_out1,  --修改人

   t.rq_user_01 = var_out2   --模块

   WHERE  t.rq_user_23 = :newValue.PRODUCT_ID

   AND t.rq_user_22 = :newValue.modify_num;

end modifysynchronizeqc;

 


 

执行的时候报错,如下:

ORA-04091:表XX发生了变化,触发器/函数不能读它

 

问题原因:

在于过程中用:newValue.MODIFY_ID再次去查目标表,这一动作被oracle认为是不合法的。

目标表的记录行如果做了更新,无需再通过ID去查询目标记录行。这一动作被oracle认为是不合法的。

 

 

 /**  

  **名称:修改单,QC同步触发器 

  **功能:修改单修改后,QC信息同步 ,以提供前台展现  

  **created by fanqd @ 2010/12/26 

  **/ 

create or replace trigger modifysynchronizeqc

  after update on tb_support_modify

   Referencing  old as old new as newValue

  for each row

 

declare

  var_out1 VARCHAR(255);

  var_out2 VARCHAR(255);

BEGIN

  SELECT u.objname INTO var_out1 FROM tb_support_userinfo u WHERE u.objno=:newValue.MODIFIER;

  SELECT WMSYS.WM_CONCAT(v.module_name) INTO var_out2 FROM tb_support_module v WHERE v.parent_id=:newValue.MODIFY_ID;

   UPDATE DEFAULT_质保单导入测试_.Req@QC114 t  

   SET t.RQ_USER_25 = '修改原因:'||:newValue.MODIFY_REASON||'/n 修改说明:'||:newValue.MODIFY_DESC||'/n    修改文件及路径:'||:newValue.MODIFY_FILE||:newValue.PROGRAM_PATH||'/n 修改表结构信息:'||:newValue.TABLE_MODIFY, --修改信息

   t.RQ_USER_26 = :newValue.SELF_TEST_DESC,   --单元测试记录

   t.RQ_USER_27 = '测试要点及建议:'||:newValue.TEST_SUGGESTION||'/n 上线步骤:'||:newValue.PUBLISH_DESC,  

   --测试要点及上线步骤

   t.RQ_REQ_TYPE = decode(:newValue.TEST_TYPE,1,'现场测试','测试室测试'),

   t.RQ_USER_04 = var_out1,  --修改人

   t.rq_user_01 = var_out2   --模块

   WHERE  t.rq_user_23 = :newValue.PRODUCT_ID

   AND t.rq_user_22 = :newValue.modify_num;

end modifysynchronizeqc;

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值