2013-08-20 56 views
0

減去列我有表Inventory添加和甲骨文

"INVENTORY_CODE" VARCHAR2(20) NOT NULL ENABLE 
"ITEM_CODE"  VARCHAR2(20) NOT NULL ENABLE 
"WAREHOUSE_CODE" VARCHAR2(20) 
"CON_TON"  NUMBER(38,5) 
"IN_Q_TON"  NUMBER(38,5) 
"OR_Q_TON"  NUMBER(38,5) 
"RES_TON"  NUMBER(38,5) 
"RET_TON"  NUMBER(38,5) 
"ST_INV"   NUMBER(38,5) 

和另一個表Inventory_warehouse

"CODE" VARCHAR2(20) NOT NULL ENABLE 
"ITEM_CODE" VARCHAR2(20) NOT NULL ENABLE 
"QUANTITY_AV_TON" NUMBER(38,5) 
"QUANTITY_AV_REAM" NUMBER(38,5) 
"QUANTITY_AV_SHEET" NUMBER(38,5) 

我想打一個觸發器來計算QUANTITY_AV_TON

QUANTITY_AV_TON = IN_Q_TON + RES_TON + RET_TON + ST_INV - CON_TON - OR_Q_TON 

我創造了這個觸發,但如果你要執行它不工作

create or replace trigger QUANTITY_TON 
AFTER insert or update or delete on INVENTORY 
for each row 
begin 
    UPDATE INVENTORY_WAREHOUSE 
    SET QUANTITY_AV_TON = 
     select (IN_Q_TON + RES_TON + RET_TON + ST_INV - CON_TON -OR_Q_TON) 
     from inventory 
     where INVENTORY.item_code = INVENTORY_WAREHOUSE.item_code; 
end; 

IN_Q_TONOR_Q_TON使用觸發器

+1

我會建議使用快速刷新物化視圖。 – haki

+0

那麼,什麼不起作用? – OldProgrammer

+0

PL/SQL:ORA-00936:缺少表達式編譯失敗,PL/SQL:SQL語句被忽略 – user2648669

回答

0

從其它表計算的值,RES_TONRET_TONST_INVCON_TON,根據正在處理的觸發器中的行的上下文值進行計算。這通常通過使用「:NEW」變量完成。我編輯了觸發器,但無法運行,所以請試試看。請閱讀Oracle Trigger Docs

CREATE OR REPLACE TRIGGER QUANTITY_TON 
    AFTER INSERT OR UPDATE OR DELETE 
    ON INVENTORY 
    FOR EACH ROW 
BEGIN 
    UPDATE INVENTORY_WAREHOUSE 
     SET QUANTITY_AV_TON = :new.IN_Q_TON 
          + :new.RES_TON 
          + :new.RET_TON 
          + :new.ST_INV 
          - :new.CON_TON 
          - :new.OR_Q_TON 
    WHERE INVENTORY_WAREHOUSE.ITEM_CODE = :new.ITEM_CODE; 

END; 
+2

你需要單獨的計算插入,更新和刪除,但是,採取:舊值 - 這不會存在的插入,並將只存在刪除 - 考慮? –

+0

的確,我只是在考慮插入。 – OldProgrammer