2014-05-10 3 views
0

DB에 다음과 같은 트리거가 있지만 인벤토리가 감소하도록 수정하는 방법이 궁금합니다. 이 트리거, 주문 금액 및 재고 수준에 모두 값이 있습니다. if 절에 update 문을 넣을 수는 없습니까? 왜 이것이 작동하지 않는 지 잘 모르겠다.오라클 트리거 삽입시

 create or replace TRIGGER INVENTORY_AVAIL 
    Before INSERT 
     ON THC_ORDER 
     FOR EACH ROW 

    DECLARE 
     v_quantity_diff number; 
     v_onhand_quantity number; 

    BEGIN 
     -- TRIGGR ON THIS... 
     --INSERT INTO THC_ORDER 
     --(FK_ORDER_NO, FK_PROD_ID, QUANITY , COMPLETE_STATUS) 
     --VALUES 
     --(:NEW.FK_ORDER_NO, :NEW.FK_PROD_ID, :NEW.QUANITY , :NEW.COMPLETE_STATUS); 
     SELECT INVENTORY_ONHAND INTO v_onhand_quantity 
     FROM THC_INVENTORY 
     WHERE :new.fk_prod_id = THC_INVENTORY.FK_PROD_ID; 

     IF((v_onhand_quantity - :NEW.QUANTITY) >= 0) 
     THEN 
     INSERT INTO THC_ORDER (FK_ORDER_NO, FK_PROD_ID, QUANTITY, COMPLETE_STATUS) 
      VALUES (:NEW.FK_ORDER_NO, :NEW.FK_PROD_ID, :NEW.QUANTITY , :NEW.COMPLETE_STATUS); 

       /* not sure if this should be a separate trigger... */ 
     UPDATE THC_INVENTORY 
      SET INVENTORY_ONHAND = v_onhand_quantity - :NEW.QUANTITY; 

     ELSE 
     raise_application_error (-20001,'ERROR: QUANTITY ' || :NEW.QUANTITY 
      || ' EXCEEDS INVENTORY ONHAND [' || TO_CHAR(v_onhand_quantity) || ']'); 
     END IF; 

    END; 

답변

1

나는 당신의 트리거 문제가 다른 테이블의 업데이트 (그것에 대해 특별한 문제)하지만 the_orders에 삽입하지라고 생각합니다. 인벤토리가 비어있을 때까지 트리거가 계단식 연결됩니다! 따라서 삽입물을 트리거로 제거하면 잘 작동합니다.