插入时的Oracle触发器

时间:2014-05-10 23:02:39

标签: sql oracle plsql oracle-sqldeveloper triggers

我的数据库中有以下触发器,但我想知道如何修改它以减少库存。我在这个触发器,订单金额和库存水平中都有两个值,我可以在if子句中放一个更新语句吗?我不确定为什么这不起作用,它编译得很好。

        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 个答案:

答案 0 :(得分:1)

我认为你的触发器中的问题不是其他表中的更新(没有特别的问题),而是插入了the_orders。它会级联触发,直到库存为空!因此,将插入物移除到触发器中,我希望它能正常工作。