Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2118818
  • 博文数量: 1647
  • 博客积分: 80000
  • 博客等级: 元帅
  • 技术积分: 9980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 15:15
文章分类

全部博文(1647)

文章存档

2011年(1)

2008年(1646)

我的朋友

分类:

2008-10-28 18:22:06


  这是我整理最近的和笔记后,所记录的一种小写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;
【责编:admin】

--------------------next---------------------

阅读(202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~