zzznzzzz 2022-01-19 17:59 采纳率: 0%
浏览 21

触发器里的update偶尔不成功

我写的一个触发器,

if inserting then 
   if  :new.pk_house IN ('C0107','C0102')  then      
      UPDATE "MES"."INVT"  
         SET "DISP_QTY" = NVL(DISP_QTY,0) -  to_number(:new.inout_flag) *:new.plan_qty + to_number(:new.inout_flag) *:new.real_qty  ,    
             "TS" = SYSDATE  
       WHERE ( MES."INVT"."HOUSE" = :new.pk_house ) AND  
             ( MES."INVT"."ITEM" = :new.item_no ) AND  
             ( MES."INVT"."BATCH"= :new.batch) ;   
   end if; 

end if;

实际应用的时候偶尔会发生update不成功的情况,可能是什么原因?基本几个月会出现那么一两次。

顺道问一下plsql在调试触发器的时候怎么变量监视器里面显示不了这种:new.house 的值?

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-01-19 19:54
    关注

    一、监视不了有很多种方式可以绕过去。

    1. 使用dbms_output.put_line(:new.house );打印
    2. 前面声明个变量,然后把:new.house 赋值到这个变量上去,然后你就可以监视这个变量的值了

    二、查问题的话,从你这个sql里看,如果INVT这个表里本就没有记录,当然更新是更新不到的;还有如果where条件里的6个值,有任何一个值为空,也是查不到的,再就是你更新的值,如果有某个值为空,做四则运算的结果也是会为空。
    还有,要注意并发的情况,如果是两个会话同时执行这个表的插入,你前面又没判断锁,是有可能出现某条更新的结果被覆盖的情况。

    三、另外,如果数据很难跟踪的话,你完全可以再加个日志表,每插一笔,就把用到的这些值都记录到日志表里去,当你发现数据对不上的时候,回头去查日志表,是不是有数据为空的情况。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 1月19日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)