这是我整理最近的测试和笔记后,所记录的一种小写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;