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