您有什么方法可以捕获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)
提前感谢。
答案 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片段的行号和对象名称。