ORACLE捕获异常对象

时间:2009-12-18 13:29:07

标签: oracle ora-12899

您有什么方法可以捕获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;

更新

使用tony示例

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)

提前感谢。

3 个答案:

答案 0 :(得分: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中的注释,并使用这些注释重新构造消息。 / p>

答案 1 :(得分:2)

没有。

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

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

要跟进以下评论,oracle 10G包括:

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

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

答案 2 :(得分:1)

是的,您可以这样做,但仅适用于源代码位置。查看Dbms_Utility.Format_Error_Stack()Dbms_Utility.Format_Call_Stack()

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