首页 > 开发 > 综合 > 正文

一个关于DATEBASE TRIGGER的问题解析

2024-07-21 02:34:04
字体:
来源:转载
供稿:网友

  这是我整理最近的测试和笔记后,所记录的一种小写DB TRIGGER的方法,只供岑考。
  
  要求:一异动表中插入入库记录时,将数量加到其库存表中的入库总数中;当异动表中插入出库记录时,将数量加到其库存表中的出库总数中;入库和出库都需要计算库存表中的库存数。
  
  CREATE OR REPLACE TRIGGER "TRG_CHGE" BEFORE INSERT OR DELETE OR UPDATE ON LY.FY_CHGE REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
  DECLARE
  V_PROD_NO FY_PROD.PROD_NO%TYPE;
  T_IMARK  NUMBER(1);--入库加减码
  T_OMARK  NUMBER(1);
  T_SMARK  NUMBER(1);
  BEGIN
  
  --如不考虑产品编码及异动类别会改变的情况
  --不考虑库存出现负数的情况
  --二者均在form中控制
  
  IF NVL(:NEW.CHGE_TYPE,:OLD.CHGE_TYPE) = 'I' THEN
  T_IMARK := 1;
  T_OMARK := 0;
  T_SMARK := 1;
  ELSE
  T_IMARK:=0;
  T_OMARK:=1;
  T_SMARK:=-1;
  END IF;
  SELECT PROD_NO INTO V_PROD_NO
  FROM FY_STOC
  WHERE PROD_NO=NVL(:NEW.PROD_NO,:OLD.PROD_NO);
  IF SQL%NOTFOUND THEN
  INSERT INTO FY_STOC (PROD_NO,IN_QTY,OUT_QTY,STOC_QTY)
  VALUES(NVL(:NEW.PROD_NO,:OLD.PROD_NO),NVL(:NEW.QTY,:OLD.QTY)*T_IMARK,NVL(:NEW.QTY,:OLD.QTY)*T_OMARK,NVL(:NEW.QTY,:OLD.QTY)*T_SMARK);
  END IF;
  IF SQL%FOUND THEN
  UPDATE FY_STOC SET
  IN_QTY=NVL(IN_QTY,0)+(NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))*T_IMARK,
  OUT_QTY=NVL(OUT_QTY,0)+(NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))*T_OMARK,
  STOC_QTY=NVL(STOC_QTY,0)+(NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))*T_SMARK
  WHERE PROD_NO=NVL(:NEW.PROD_NO,:OLD.PROD_NO);
  END IF;
  END;

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表