2013-08-20 49 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