[英]Oracle Trigger on Insert or Delete or Update
嘗試創建以任何方式更新表后運行的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是我記錄這些事件的新表
與其他人的代碼相比,它看起來應該可以運行,但是我得到“警告:觸發器因編譯錯誤而創建”。
我認為問題在於刪除觸發器的:new名稱。 畢竟,隨着記錄的刪除,沒有新值。 您只能在刪除時訪問: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腳本進行編譯,請在正斜杠調用之后在“ end;”之后編譯觸發器。 語句,添加一行內容:
顯示錯誤,觸發您的_TRIGGER_NAME;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.