插入或删除或更新时的Oracle触发器

时间:2011-03-02 17:43:09

标签: sql 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是我正在记录这些事件的新表

将它与其他人的代码进行比较它看起来应该运行但是我得到“警告:触发器因编译错误而创建。”

1 个答案:

答案 0 :(得分: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脚本编译,则在正斜杠调用之后编译触发器“结束”;声明,添加一行说:

显示错误触发YOUR_TRIGGER_NAME;