2013-08-26 60 views
0

我有兩個表 的OrderItems:更新觸發時,行不存在

"ORDER_ITEMS_CODE" VARCHAR2(20) NOT NULL ENABLE, 
"ORDER_CODE" VARCHAR2(20) NOT NULL ENABLE, 
"ITEM_CODE_ORDERS" VARCHAR2(20) NOT NULL ENABLE, 
"ORDER_QUANTITY" NUMBER(4,0) NOT NULL ENABLE, 
"ORDER_UNIT" VARCHAR2(5) NOT NULL ENABLE, 
"UNIT_PRICE" NUMBER(38,5), 
"ORDERED_IN" VARCHAR2(6), 
"OR_QUANTITY_TON" NUMBER(38,5), 
"Warehouse_CODE" VARCHAR2(20) NOT NULL ENABLE 

其他表是庫存:

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

我創建了一個觸發計算 「OR_QUANTITY_TON」= SUM( 「OR_QN_TON」)

create or replace trigger sum_Or_IT 
after insert or update or delete on orderitems 
begin 
    update INVENTORY set OR_Q_TON = (
     select sum(or_quantity_ton) from orderitems 
     where 
     orderitems.item_code_orders = INVENTORY.item_code 
     and 
     warehouse_code = '1'); 
end; 

這是庫存表,列OR_Q_TON是總和的訂單數量,但如果一個項目不存在於訂單中,我希望訂單數量爲零。 我想破例如果「item_code_orders」不存在於表中「的OrderItems」,那麼OR_Q_TON = 0

我試過,但它沒有工作,我得到了( - )不是(0)

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    update INVENTORY set OR_Q_TON = 0 ; 

回答

0

觸發應該

create or replace trigger sum_Or_IT 
after insert or update or delete on orderitems 
begin 
    update INVENTORY set OR_Q_TON = (
     select coalesce(sum(or_quantity_ton),0) from orderitems 
     where 
     orderitems.item_code_orders = INVENTORY.item_code 
     and 
     warehouse_code = '1')   
end; 

通過合併,而不是例外

0

其也不例外,而在上述 您需要使用sql%rowcount更新的情況下,oracle會不會引發錯誤時拋出,

TRY:

IF SQL%ROWCOUNT = 0 THEN 
    update INVENTORY set OR_Q_TON = 0 ; 
END IF; 
+0

我嘗試這個功能解決了這個問題,但我沒有」 t get(0),,,這是一個庫存表,OR_Q_TON列是每個項目的訂購數量的總和,但是如果一個項目不存在於訂單中,我希望訂單數量爲零。 – user2648669

0

你可以用它來代替使用異常,

IF SQL%NOTFOUND THEN 
    UPDATE inventory SET or_q_ton = 0 ; 
    COMMIT; 
END IF; 
+0

觸發器編譯沒有錯誤,但我也得到( - )而不是(0) – user2648669

+0

可能是你錯過了一些東西。你可以請你發佈你修改後的代碼。 – Dba

+0

'創建或替換觸發器插入或更新後sum_Or_IT 或刪除的OrderItems 從的OrderItems 其中 orderitems.item_code_orders = INVENTORY.item_code 和 warehouse_code =「開始 更新清單組OR_Q_TON =( SELECT SUM(or_quantity_ton)1 「); IF SQL%NOTFOUND THEN UPDATE inventory SET or_q_ton = 0; COMMIT; END IF; 結束;' – user2648669