【问题标题】:Exclude Extra Error Information from RAISE_APPLICATION_ERROR从 RAISE_APPLICATION_ERROR 中排除额外的错误信息
【发布时间】:2015-08-04 02:41:46
【问题描述】:

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

例如它会得到

 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

如何在错误消息返回到我的应用程序之前从错误消息中删除额外信息?下面是我的测试代码...

CREATE OR REPLACE TRIGGER CUSTOM_ERROR
BEFORE INSERT OR UPDATE ON {SCHEMA_NAME}.{TABLE_NAME} FOR EACH ROW
BEGIN
    RAISE_APPLICATION_ERROR(-20111, 'There is a custom error here');
END; 

【问题讨论】:

  • 你的代码是什么样的?我没有看到您发布的任何代码。你是如何处理异常的?
  • @LalitKumarB 没有处理。为您调整了代码。我希望用户从应用程序中看到这个错误。它只显示它从 Oracle 收到的错误。我希望错误与我在 RAISE_APPLICATION_ERROR 中输入的完全一致,仅此而已
  • 但这不会有帮助,因为不引发已经定义的异常并且只有用户定义的异常。
  • @LalitKumarB 要解决的重要问题是我的问题,而不是从其他角度来看我需要的东西是否有用。
  • @LalitKumarB 另一个需要注意的重要事情是,它是一个不同于系统错误的“应用程序错误”。我确实向您保证,它对谁得到它很有用,它会准确地告诉他们哪里出了问题以及如何解决它。

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


【解决方案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

【讨论】:

  • 这不会向应用程序传递异常。你可以发回一个字符串,当然,例如作为输出参数 - 包装导致触发器在过程中触发的语句 - 但是您使用的是自己的错误处理过程,而不是内置的异常处理。
  • @AlexPoole 在生产代码中看到 dbms_output 将是一场噩梦。是的,你是对的,我的意思是将它作为 PL/SQL 单元的 OUT 参数传递给应用程序。
  • 据我了解这个答案,我必须让应用程序 (MapInfo) 将它发送到数据库的插入/更新 SQL 更改为获取返回值的过程调用?不幸的是,我无法更改客户端应用程序的功能,所以这是不可能的:(
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2018-08-28
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多