簡體   English   中英

Oracle插入,刪除或更新時觸發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM