暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

错误堆饯开发案例

Oracle蓝莲花 2021-04-15
505

1.明确需求:小dawn说要在存储过程或者自定义函数中定义错误日志表,打印sqlcode sqlerrm错误结果,以备问题定位,就此问题的解决技术本文档展开如下讨论,本文章涉及知识点包括sqlerrm,sqlcode

dbms_utility,utl_call_stack

--sqlcode sqlerrm

1.1名词解释:

sqlerrm函数返回与错误代码相关联的错误消息,sqlcode则返回错误编码。表达式的值为Oracle数据库错误代码。有关Oracle数据库错误代码的列表关注Oracle Database Error Messages Reference. 

本文档不对错误代码做解释说明。主要完成Description中涉及知识点的pl/sql代码实现


1.2注意事项:

1.2.1与SQLCODE一样,没有error_code的SQLERRM只在异常处理程序中有用。在异常处理程序之外,或者error_code的值为0时,SQLERRM返回ora - 0000

1.2.2如果error_code的值为+ 100,则SQLERRM返回ora - 01403

1.2.3如果error_code的值为正数,而不是+ 100,那么SQLERRM将返回此messag

1.3重点技术解析:

1.3.1如果error_code的值是一个负数,其绝对值为Oracle数据库错误代码,SQLERRM将返回与该错误代码关联的错误消息,比如下面的查询:

 结果返回为:SQLERRM(-6511): ORA-06511: PL/SQL: 游标已经打开

1.3.2如果error_code的值为负数,其绝对值不是Oracle数据库错误代码,则SQLERRM返回此消息:

结果集返回为:SQLERRM(-50000): ORA-50000: Message 50000 not found;  product=RDBMS; facility=ORA

1.4.1示例演示:外部程序调用Oracle存储过程,利用sqlerrm sqlcode记录错误信息:

DROP TABLE T_600_ERRORS_RECORD CASCADE CONSTRAINTS PURGE; 

--创建错误日志表

--设置错误日志表字段属性

--为错误日志表创建序列

--用于错误打印的存储过程

--实验调用过程,我们随便写一个错误的代码用来调用

--注意这个动态sql会报错表或试图不存在,ORA-00942,DBA_OBJECT我少写了一个字母S

--验证当前日志表是否记录

-----------------------------------------------

2.FORMAT_CALL_STACK ,FORMAT_ERROR_BACKTRACE Function

FORMAT_CALL_STACK:此函数格式化当前调用堆栈。这可以用于任何存储过程或触发器来访问调用堆栈。这对于调试非常有用。DBMS_UTILITY.FORMAT_CALL_STACK RETURN VARCHAR2

FORMAT_ERROR_BACKTRACE:这个函数在抛出异常时显示调用堆栈,使子程序是从外部作用域中的异常处理程序调用的。输出类似于SQLERRM函数的输出,但不受相同大小限制

注意:如果当前没有处理错误,则返回空字符串。


示例脚本:

--编写一个存储过程

--调用过程

--代码封装

--打印T_600_ERRORS_RECORD错误日志表内容:

1 1 Module Name Of This Session PL/SQL 2017/12/19 17:05:40 -942 ORA-00942: 表或视图不存在 "ORA-06512: 在 line 5

2 2 Module Name Of This Session PL/SQL 2017/12/19 19:31:29 -942 ORA-00942: 表或视图不存在 "ORA-06512: 在 line 6

3 3 Module Name Of This Session PL/SQL 2017/12/19 19:33:44 -2030 ORA-02030: 只能从固定的表/视图查询 "-2030:ORA-02030: 只能从固定的表/视图查询ORA-06512: 在 line 7


------------------------------------------------

3.UTL_CALL_STACK Function :

UTL_CALL_STACK包提供一个接口来提供当前执行的子程序的信息。函数返回子程序名称、单元名称、所有者名称、版本名称和给定动态深度的行号。其他函数返回错误堆栈信息

具体概念信息参考:https://docs.oracle.com/database/121/ARPLS/u_call_stack.htm#ARPLS74105,以下为示例代码:


-- 显示调用堆饯过程

-- 显示嵌套调用过程

--利用存储过程封装:


------------------------------------------------

4.利用DBMS_UTILITY.format_error_stack模拟errorstack的调用过程

-------------------------------------------

5.关于errorstack的代码封装

----------------------------------------------

                        《点亮梦想,拒绝平庸》

                       600团队(QQ群:851604218)

文章转载自Oracle蓝莲花,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论