【发布时间】:2016-05-12 16:46:55
【问题描述】:
我用下面的代码创建了一个触发器
create or replace trigger DTE_SAVE_ORIGINAL_VAL
after update
on attrvaldesc
FOR Each row
when (new.field2 is null)
Declare
attrvaloriginal attrval.attrval_id%TYPE;
attrval_id attrval.attrval_id%TYPE;
language_id attrvaldesc.language_id%type;
storeent_id attrval.storeent_id%type;
PRAGMA AUTONOMOUS_TRANSACTION;
Begin
Dbms_Output.Put_Line(:OLD.attrval_id);
select attrval_id into attrvaloriginal from attrval where identifier = (select identifier||'_original' from attrval where attrval_id= :OLD.attrval_id and storeent_id=10051) and storeent_id=10051;
if (attrvaloriginal > 0) then
Dbms_Output.Put_Line(attrvaloriginal);
Dbms_Output.Put_Line(:NEW.value);
delete from attrval where attrval_id = attrvaloriginal and storeent_id=10051;
commit;
END IF;
End;
触发器已编译,当我触发更新 attrvaldesc 表的作业时,我面临以下异常
异常信息:
捕获了一个 SQL 异常。错误是:ORA-04098:触发器 'WCS_ADMIN_HFI.DTE_SAVE_ORIGINAL_VAL' 无效并且重新验证失败
堆栈跟踪:
com.ibm.commerce.foundation.dataload.exception.DataLoadSQLException:捕获了 SQL 异常。错误是:ORA-04098:触发器“WCS_ADMIN_HFI.DTE_SAVE_ORIGINAL_VAL”无效并且重新验证失败
为了检查我的触发器中是否有任何错误,我做了一个
SHOW ERRORS TRIGGER DTE_SAVE_ORIGINAL_VAL;
我退回了以下
18/1 PLS-00103:遇到符号“DROP”
【问题讨论】:
-
您的触发器没有“drop” - 您确定加载了正确的版本吗?啊,它也没有 18 行,所以你是把它作为一个更大的脚本的一部分创建的,而只是省略了
/来执行create trigger?你需要它,因为它是 PL/SQL。 -
是的,我没有在最后添加 /。让我试试
-
它现在可以工作了。谢谢亚历克斯!!