1

嗨,有什么方法可以捕获在 ORACLE 中引发异常的对象(例如表和列)?

我需要确定对象名称以自定义错误消息,向用户显示发生异常的表和字段的名称。

我知道有一个变量 SQLCODE 和 SQLERRM,但我想知道是否有任何其他变量或函数可以返回错误对象的名称。

我想要这样的东西

exception
  when others then
    begin
     if SQLCODE = -20010
       then dbms_output.put_line('The Value Too Large in the field ' || GetObjectNameError);
     end if;
   end;

更新

使用托尼的例子

CREATE TABLE t (v varchar2(3));
COMMENT ON TABLE t IS 'my table description';
COMMENT ON COLUMN t.v IS 'my column description';
insert into t values ('xxxx');

实际上引发了这个错误 *

ERROR at line 1:
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3)

我想展示这样的东西

ORA-12899: value too large for column "my column description" in table "my table description" (actual: 4, maximum: 3)

提前致谢。

4

3 回答 3

2

不,没有。但是最新版本的 Oracle(至少 10G)会为您执行此操作,但有以下例外:

SQL> create table t (v varchar2(3));

Table created.

SQL> insert into t values ('xxxx');
insert into t values ('xxxx')
                      *
ERROR at line 1:
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3)

要获得您要查找的内容,您可以解析此错误以获取表名和列名(本示例中的 T 和 V),然后查找来自 USER_TAB_COMMENTS 和 USER_COL_COMMENTS 的注释并使用它们重新构建消息。

于 2009-12-18T13:53:28.673 回答
2

不。

好吧, raise_application_exception() 允许您使用两项,错误代码和一条文本消息。如果您抛出自己的异常,您可以格式化消息以包含此信息并将其解析出来。

另一种方法是将此信息放入全局“错误表”中,然后引发异常。

为了跟进下面的评论,oracle 10G 包括:

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

这允许您解析多个引发的错误。这篇博文展示了如何解析这些信息以从调用堆栈中提取更多更好的信息。但它仍然需要解析错误消息而不是包含您自己的错误消息。

于 2009-12-18T13:54:55.893 回答
1

是的,您可以这样做,但仅限于源代码位置。签出Dbms_Utility.Format_Error_Stack()Dbms_Utility.Format_Call_Stack()

您会得到一个字符串,其中包含发生错误的 PL/SQL 片段的行号和对象名称。

于 2009-12-18T14:32:31.917 回答