【问题标题】:Exception inside Trigger in Oracle 11g XE causes ORA-04088 errorOracle 11g XE 中触发器内部的异常导致 ORA-04088 错误
【发布时间】:2018-04-15 23:10:27
【问题描述】:

我正在学习如何使用 Oracle 11g XE 在触发器中编写用户定义的异常,似乎this question 的答案就是一个很好的例子:

create or replace trigger trig1
 before update
 of sal
 on emp
 for each row
 when (new.sal < old.sal)

declare    
   user_xcep EXCEPTION;
   PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
begin
   raise user_xcep;
end;
/

但是,当我尝试更新一条值为sal 低于原始值的记录时,我收到以下错误:

从第 24 行开始的错误命令 -
更新 emp set sal = 1100 其中 id = 1001
错误报告 -
ORA-20001:
ORA-06512:在“USER01.TRIG1”,第 5 行
ORA-04088: 执行触发器“USER01.TRIG1”时出错

我从网上查到,这意味着触发器代码中存在运行时错误。但问题出在哪里?由于上面的代码来自2013年写的答案,因为我使用的是新版本的Oracle,所以原来的触发器不再工作了?我该如何解决?

【问题讨论】:

  • 我认为它按预期工作。您在触发器内引发异常,该异常会传播到触发语句。
  • @KaushikNayak 但是当我在begin 之后但在raise 之前放置一行dbms_output.put_line('Hi'); 时,然后重新编译触发器,然后再次执行更新查询,'Hi' 行永远不会显示在 DBMS 输出窗口中。为什么?
  • SET SERVEROUTPUT ON 运行更新语句,并发出回滚。它应该会出现。
  • @GreenPenguin 尝试在newold 之前添加冒号:
  • @BarbarosÖzhan 在触发器中,当您将新旧元素放入 when 子句时,不需要 :。它会抛出错误。

标签: oracle exception plsql triggers


【解决方案1】:

发生这种情况是因为您需要在自定义错误发生时指定发生了什么?

Create Or Replace Trigger trig1
  Before Update Of sal On emp
  For Each Row
  When (Nvl(new.sal, 0) < Nvl(old.sal, 0))
Declare
  user_xcep Exception;
  Pragma Exception_Init(user_xcep, -20001);
Begin
  dbms_output.put_line('test');
  Raise user_xcep;
Exception
  When user_xcep Then
    dbms_output.put_line('-'||sqlcode||' - '||sqlerrm);
  When Others Then
    dbms_output.put_line(sqlerrm);
End;

这可以使用Exception 子句定义,首先是自定义错误,然后是系统错误,如NO_DATA_FOUNDTO_MANY_ROWS,最后是OTHERS 错误,这些错误会捕获触发器内发生的任何其他错误。

如果您需要停止程序,您可以在自定义异常中使用Raise_Application_Error

Raise_Application_Error(sqlcode, 'Custom Error Message');

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2013-11-29
    • 2013-11-29
    • 2012-01-10
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多