从RAISE_APPLICATION_ERROR中排除额外错误信息

时间:2015-05-22 07:14:11

标签: oracle plsql error-handling exception-handling oracle11g

我在PL / SQL触发器中引发了一条错误消息,它工作正常,只是它返回的内容超过了我为应用程序指定的错误。除了自定义错误,我还会获得有关错误发生的行和触发器的信息。

例如它会得到

<div id="diagramContainer"> </div>

我真正想要的是:

 ORA-20111: There is a custom error here
 ORA-06512: at "{schema_name}.{trigger_name}", LINE 2
 ORA-04088: error during execution of trigger {schema_name}.{trigger_name}<br>
 .Operation canceled.

如何在错误消息返回到我的应用程序之前删除其他信息?我的测试代码如下......

ORA-20111: There is a custom error here

1 个答案:

答案 0 :(得分:1)

您可以使用 RAISE_APPLICATION_ERROR

例如,

SQL> DECLARE
  2    custom_err EXCEPTION;
  3    PRAGMA EXCEPTION_INIT( custom_err, -20099 );
  4  BEGIN
  5    raise_application_error( -20099, 'This is a custom error' );
  6  EXCEPTION
  7  WHEN custom_err THEN
  8    dbms_output.put_line( sqlerrm );
  9  END;
 10  /
ORA-20099: This is a custom error

PL/SQL procedure successfully completed.

SQL>

PRAGMA EXCEPTION_INIT是提供自定义错误编号,可能会在 -20001 -20999

的范围内变化

但是,您需要处理已定义的异常

例如,

SQL> DECLARE
  2    custom_err EXCEPTION;
  3    PRAGMA EXCEPTION_INIT( custom_err, -20099 );
  4    v number;
  5  BEGIN
  6    SELECT empno INTO v FROM emp WHERE empno = 1234;
  7    raise_application_error( -20099, 'This is a custom error' );
  8  EXCEPTION
  9  WHEN custom_err THEN
 10    dbms_output.put_line( sqlerrm );
 11  END;
 12  /
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 6


SQL>

抛出 NO_DATA_FOUND 异常。但是,您可以抑制它,它将使错误堆栈中包含其他消息。

SQL> DECLARE
  2    custom_err EXCEPTION;
  3    PRAGMA EXCEPTION_INIT( custom_err, -20099 );
  4    v number;
  5  BEGIN
  6    SELECT empno INTO v FROM emp WHERE empno = 1234;
  7    raise_application_error( -20099, 'This is a custom error' );
  8  EXCEPTION
  9  WHEN no_data_found THEN
 10     raise_application_error( -20099, 'This is a custom error' );
 11  WHEN custom_err THEN
 12    dbms_output.put_line( sqlerrm );
 13  END;
 14  /
DECLARE
*
ERROR at line 1:
ORA-20099: This is a custom error
ORA-06512: at line 10


SQL>

我总是希望将错误记录为尽可能详细。 raise_application_error适用于在应用程序上显示的自定义消息,但是,我会记录程序中的所有错误。

请看一下:

  • dbms_utility.format_error_stack
  • dbms_utility.format_error_backtrace