2012-11-19 66 views
0

我有一個表格中的產品列表,我想創建一個觸發器來讀取特定產品的庫存,然後如果庫存小於5則顯示一條消息。這個概念非常簡單。Oracle觸發器:條件語句

這是我到目前爲止。

SET SERVEROUTPUT ON 
SET ECHO ON 

CREATE OR REPLACE TRIGGER TRG_REORDERSTOCK 
AFTER INSERT OR UPDATE OF S_QUANTITY ON STOCK_INVENTORY 
FOR EACH ROW 
BEGIN 
IF :OLD.S_QUANTITY <= 10 THEN 
    DBMS_OUTPUT.PUT_LINE ('Warning: ----- product with ID (' || :OLD.BR_ID || ') has (' || :NEW.S_QUANTITY || ') units remaining, please re-order -----'); 
    ELSE 
     DBMS_OUTPUT.PUT_LINE ('UPDATE COMPLETE'); 
    END IF; 
END; 
/

現在要測試觸發器,我將更新特定產品的手數;

UPDATE STOCK_INVENTORY 
SET S_QUANTITY = 4 
WHERE BR_ID = 1 
AND P_ID = 6; 

,其結果是:

Warning: ----- product with ID (1) has (4) units remaining, please re-order ----- 

這意味着觸發工作。然而,stock_inventory有一些庫存水平低於10的產品,但是有條件的,它只顯示當前交易的消息。

這是stock_inventory中的一些產品的列表,這是一個鏈接表;

SQL> SELECT * FROM STOCK_INVENTORY;

 BR_ID|  P_ID|S_QUANTITY 
----------|----------|---------- 
     1|   1|  10 
     1|   6|   4 
     1|   3|  30 
     1|   8|  24 
     1|   9|  18 
     2|  10|   9 
     2|   2|  10 
     2|  20|  15 
     2|  16|  17 
     2|  13|  20 
     3|  21|  15 

如何顯示數量小於10的產品列表?我對oracle很新穎。非常感謝。

謝謝

回答

2

首先,你爲什麼要用這種觸發器?爲什麼要讓觸發器列出需要重新排序的產品,而不是那些當前事務正在影響的產品呢?由於絕對不能保證任何人都不會看到寫入DBMS_OUTPUT的任何內容,因爲提醒某人下訂單以重新訂購產品6,似乎違反直覺,因爲您通常希望將庫存更新與訂單中的訂單分開庫存,整個方法似乎沒有道理。

假設這是一個家庭作業,但是你可以使用一個語句級觸發器,而不是

CREATE OR REPLACE TRIGGER trg_new_reorder_stock 
    AFTER INSERT OR UPDATE ON stock_inventory 
BEGIN 
    FOR x IN (SELECT * 
       FROM stock_inventory 
      WHERE s_quantity <= 10) 
    LOOP 
    dbms_output.put_line('Reorder ' || x.p_id || ' it has only ' || x.s_quantity || ' units remaining.'); 
    END LOOP; 
END; 

因爲這涉及到一個語句級觸發器,可以查詢stock_inventory表,不用擔心一個變異表例外。但是,這也意味着,每次插入效率低下的單個行時,都會對整個表執行潛在的昂貴查詢。

+0

感謝賈斯汀和很高興見到你身邊你已經幫助我很大去年,感謝指出這些問題,我真的不需要知道產品列表少於10,它可以用一個簡單的SQL查詢。是的,我只需要知道當前交易的數量。 –

+0

至於觸發器,我很新,我仍然不知道什麼時候使用triger的函數或過程和光標更好。我在作業中需要回答的問題是:'3.3。確定庫存何時達到其最小現有數量,低供應量的產品必須由工作人員重新訂購,並且必須與商店的首選供應商之一一起放置。' –

+0

如何將dbms輸出輸出到文本?我一直在閱讀假脫機程序和程序,但相當混亂 –