代码之家  ›  专栏  ›  技术社区  ›  RRUZ

Oracle捕获异常对象

  •  1
  • RRUZ  · 技术社区  · 15 年前

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

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

    我知道有一个变量sqlcode和sqlerm,但我想知道是否还有其他变量或函数返回错误对象的名称。

    我想要像这样的东西

    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)
    

    事先谢谢。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Tony Andrews    15 年前

    不,没有。但是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),然后从“用户”选项卡“注释”和“用户”栏“注释”中查找注释,并使用这些注释重新构造消息。

        2
  •  2
  •   Thomas Jones-Low    15 年前

    不。

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

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

    为了跟进下面的评论,Oracle10g包括:

    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
    

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

        3
  •  1
  •   Robert Giesecke    15 年前

    是的,您可以这样做,但只能用于源代码位置。退房 Dbms_Utility.Format_Error_Stack() Dbms_Utility.Format_Call_Stack() .

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

    推荐文章