2011-03-02 163 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