2011-12-10 117 views
0

希望這是關於觸發器的許多問題中的最後一個!仍然使用Order_line實體是Order和Products之間的鏈接實體的相同數據庫。有了這個觸發器,我只想檢查當前訂單數量是否大於產品庫存。目前,我將通過使用兩個變量,Ordered(數量)和Total(庫存)並比較它們來完成此工作,但這不起作用。 如果數量大於庫存量,則必須刪除正在插入的記錄並引發錯誤。Oracle:產品庫存vs數量觸發器

CREATE OR REPLACE TRIGGER Checks_Order 
BEFORE INSERT ON order_line 
FOR EACH ROW 
DECLARE 
ordered int; 
total INT; 

BEGIN 
SELECT ol.quantity INTO ordered FROM order_line ol WHERE 
ol.product_no = :new.product_no; 

if(ordered>0) then 
SELECT p.stock INTO total FROM 
products p WHERE p.product_no = :new.product_no; 
    IF (ordered < total) then 
DELETE FROM order_line ol where ol.order_no = :new.order_no; 
    RAISE_APPLICATION_ERROR(-20103, 'Not enough stock!'); 
END IF; 
END IF; 

END; 
. 
run 

請幫忙嗎?

+1

當你說這是不是工作,你是什麼意思?它仍然插入行嗎?它不會拋出異常嗎? –

回答

2

觸發器將無法工作,因爲您無法從表中選擇或甚至從觸發器所屬的表中刪除。

但實際上並不需要,可以通過new.quantity獲得有序的值。

如果您提出錯誤,則INSERT不會發生,不需要DELETE這一行。

所以 - 假如我理解正確你的意圖 - 以下應該做你想要什麼:

CREATE OR REPLACE TRIGGER Checks_Order 
BEFORE INSERT ON order_line 
FOR EACH ROW 
DECLARE 
    total INT; 
BEGIN 
    if (:new.quantity > 0) then 
    SELECT p.stock 
     INTO total 
    FROM products p 
    WHERE p.product_no = :new.product_no; 

    IF (:new.quantity > total) then 
     RAISE_APPLICATION_ERROR(-20103, 'Not enough stock!'); 
    END IF; 
    END IF; 

END; 
/

順便說一句:我想你想:new.quantity > total<總

+0

太好了,非常感謝。對不起,這一切的笨拙,是一個急於。我已經添加了一行以從產品庫存中刪除適當的金額,再次感謝。 –