【问题标题】:ORACLE capture exception objectORACLE 捕获异常对象
【发布时间】:2009-12-18 13:29:07
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 你真的不希望以这种方式捕获 WHEN OTHERS:调用你的代码的程序将不知道它是成功还是失败。
  • 请详细说明您想要达到的目标。具体来说,您能否解释一下为什么 Tony 的解决方案不符合要求。

标签: oracle ora-12899


【解决方案1】:

不,没有。但更新的 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 中查找 cmets 并使用它们重新构造消息。

【讨论】:

  • 托尼,我已经知道了,但我需要向用户显示存储在元数据中的列和表的描述,而不是实际名称。
  • 我终于不得不解析列名和表名了。
【解决方案2】:

没有。

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

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

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

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

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

【讨论】:

  • RAISE_APPLICATION_ERROR 有一个可选的第三个(布尔值)参数,如果为真,它将包括捕获到的期望被包含在调用堆栈中。默认值为 false,这就是此信息容易丢失的原因。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多