2011-03-02 253 views
1

嘗試創建在以任何方式更新表之後運行的Oracle觸發器。我一直在谷歌搜索這一切早,與此想出了:Oracle插入或刪除或更新時觸發

CREATE OR REPLACE TRIGGER gb_qty_change 
AFTER UPDATE OR INSERT OR DELETE ON F_ITEM_STORE 
FOR EACH ROW 
DECLARE 
    v_qty V_AD_ON_HAND%rowtype; 
    v_isbn TD_ITEM_DESCRIPTION.TD_IDENTIFIER%type; 
BEGIN 
    delete from gb_transaction where gb_tide = :new.ITST_ITEM_TIDE_CODE; 
    select TD_IDENTIFIER INTO v_isbn from TD_ITEM_DESCRIPTION where TD_TIDE = :new.ITST_ITEM_TIDE_CODE; 
    select * INTO v_qty from V_AD_ON_HAND where ITST_ITEM_TIDE_CODE = :new.ITST_ITEM_TIDE_CODE; 
    insert into gb_transaction(gb_tide, gb_isbn, gb_used_on_hand, gb_new_on_hand) 
     values(:new.ITST_ITEM_TIDE_CODE, v_isbn, v_qty.USED_ON_HAND, v_qty.NEW_ON_HAND); 
END; 
/

我試圖保持它每TIDE_CODE單個記錄的新表。

V_AD_ON_HAND是一個拉取庫存盤點的視圖。 gb_transaction是我記錄這些事件的新表格

與其他人的代碼比較,它看起來應該運行,但我得到「警告:編譯錯誤時創建的觸發器」。

+2

假設您使用的是SQL * Plus,當您收到警告(指出您的觸發器(或任何其他PL/SQL塊)有編譯錯誤)時,可以在SQL提示符處鍵入「SHOW ERRORS」以獲取編譯列表錯誤。這應該有助於確定特定的錯誤。 – 2011-03-02 18:42:23

回答

3

這個問題,我相信是與:刪除觸發器的新指定。畢竟,記錄被刪除後,沒有新的價值。您只能在刪除時訪問:OLD值。

如果您通過操作觸發觸發器,則可以執行此操作。

CREATE OR REPLACE TRIGGER gb_qty_change 
AFTER UPDATE OR INSERT OR DELETE ON F_ITEM_STORE 
FOR EACH ROW 
DECLARE 
    v_qty V_AD_ON_HAND%rowtype; 
    v_isbn TD_ITEM_DESCRIPTION.TD_IDENTIFIER%type; 
BEGIN 
    IF INSERTING or UPDATING then 
    ... insert your existing code 
    ELSE 
    ... do something similar with the :old values for the deleting case 
    end if; 
END; 
/

順便說一句,如果你告訴我們錯誤是什麼,而不僅僅是你有一個錯誤,這通常是有幫助的。如果通過SQL * Plus腳本進行編譯,則在正向斜槓調用後編譯「結束」之後的觸發器。聲明中,添加一行說:

SHOW ERRORS TRIGGER YOUR_TRIGGER_NAME;

+0

你也可以運行「select * from user_errors where name ='GB_QTY_CHANGE';」得到錯誤(或所有錯誤) – Harrison 2011-03-02 18:37:34

+0

這兩個答案幫助我調試問題。新的價值觀也是問題。多謝你們! – tylerjohnst 2011-03-02 19:11:47