Oracle 错误日志表及异常处理包详解 附源码

1 概述

1. 目的:'快速定位程序异常'

2. 包处理的核心思想:'自治事务' -- 自治事务的 "提交、回滚" 与 主事务 之间互不影响

3. 错误异常记录逻辑大体一致,此处记录,方便需要使用时复制、粘贴

4. 验证思路:通过执行报错的过程,观察 '程序执行结果' 和 '日志表' 数据插入情况

2 效果演示

程序执行截图:

日志表查询截图:

3 源码

说明:
1. 测试中,共有 2 个用户 -- 模拟实际开发场景
  (1) odsdata: 存放业务数据
  (2) odscde : 执行具体操作
  -- 为了方便测试,也可以去掉所有 '属主 owner'

3.1 错误日志表

CREATE TABLE odsdata.ods_program_error_log (
 error_log_id    VARCHAR2(10) NOT NULL, -- CONSTRAINT pk_opel_error_log_id PRIMARY KEY(error_log_id)
 owner        VARCHAR2(30),
 package_name    VARCHAR2(30),
 procedure_name   VARCHAR2(30),
 error_comment    VARCHAR2(1000),
 error_backtrace   VARCHAR2(400),
 error_stack     VARCHAR2(4000),
 call_stack     VARCHAR2(4000),
 error_date     DATE NOT NULL,
 oracle_execute_user VARCHAR2(50),
 um_id        VARCHAR2(50)
);

COMMENT ON TABLE odsdata.ods_program_error_log IS '程序错误日志表';
COMMENT ON COLUMN odsdata.ods_program_error_log.error_log_id IS '错误日志id';
COMMENT ON COLUMN odsdata.ods_program_error_log.owner IS '属主';
COMMENT ON COLUMN odsdata.ods_program_error_log.package_name IS '包名';
COMMENT ON COLUMN odsdata.ods_program_error_log.procedure_name IS '过程名';
COMMENT ON COLUMN odsdata.ods_program_error_log.error_comment IS '错误备注';
COMMENT ON COLUMN odsdata.ods_program_error_log.error_backtrace IS '错误跟踪';
COMMENT ON COLUMN odsdata.ods_program_error_log.error_stack IS '错误堆栈';
COMMENT ON COLUMN odsdata.ods_program_error_log.call_stack IS '调用堆栈';
COMMENT ON COLUMN odsdata.ods_program_error_log.error_date IS '错误时间';
COMMENT ON COLUMN odsdata.ods_program_error_log.oracle_execute_user IS 'oracle执行用户';
COMMENT ON COLUMN odsdata.ods_program_error_log.um_id IS '操作人员um账号';

GRANT SELECT, INSERT, UPDATE ON odsdata.ods_program_error_log TO odscde;

3.2 异常处理包

扩展:Oracle 序列详解(sequence)

package:

CREATE OR REPLACE PACKAGE odscde.pkg_ods_error_handle IS
 --*************************************************
 --功能说明: 错误日志
 --参数说明: i_procedure_name 程序名
 --     i_error_comment  错误备注(手工添加的)
 --调用函数:
 --修改记录: create by YoYo 2020-12-17
 --*************************************************
 PROCEDURE exception_handle(i_procedure_name IN VARCHAR2,
               i_error_comment IN VARCHAR2);
END pkg_ods_error_handle;

package body:

CREATE OR REPLACE PACKAGE BODY odscde.pkg_ods_error_handle IS
 --*************************************************
 --功能说明: 错误日志
 --参数说明: i_procedure_name 程序名
 --     i_error_comment  错误备注(手工添加的)
 --调用函数:
 --修改记录: create by YoYo 2020-12-17
 --*************************************************
 PROCEDURE exception_handle(i_procedure_name IN VARCHAR2,
               i_error_comment IN VARCHAR2) IS
  PRAGMA AUTONOMOUS_TRANSACTION; -- !!! 自治事务
  v_log_info odsdata.ods_program_error_log%ROWTYPE;
 BEGIN
  v_log_info.error_log_id    := '1'; -- 异常错误id(一般是 "获取序列号",此处仅演示)
  v_log_info.procedure_name   := i_procedure_name; -- 程序名
  v_log_info.error_comment    := i_error_comment;
  v_log_info.oracle_execute_user := sys_context('USERENV', 'SESSION_USER'); -- oracle执行用户
  v_log_info.um_id        := nvl(sys_context('USERENV', 'OS_USER'),
                     USER); -- 操作人员um账号
  v_log_info.error_backtrace   := dbms_utility.format_error_backtrace; -- 错误跟踪
  v_log_info.error_stack     := dbms_utility.format_error_stack; -- 错误堆栈
  v_log_info.call_stack     := dbms_utility.format_call_stack; -- 调用堆栈
  v_log_info.error_date     := SYSDATE;

  -- 可选列
  ---- 包属主
  v_log_info.owner := substr(v_log_info.error_backtrace,
                instr(v_log_info.error_backtrace, '"', 1) + 1,
                (instr(v_log_info.error_backtrace, '.', 1) -
                instr(v_log_info.error_backtrace, '"', 1) - 1));
  ---- 包名
  v_log_info.package_name := substr(v_log_info.error_backtrace,
                   instr(v_log_info.error_backtrace,
                      '.',
                      1) + 1,
                   (instr(v_log_info.error_backtrace,
                       '"',
                       1,
                       2) - instr(v_log_info.error_backtrace,
                             '.',
                             1) - 1));

  -- 插入数据
  INSERT INTO odsdata.ods_program_error_log
   (error_log_id,
    owner,
    package_name,
    procedure_name,
    error_comment,
    error_backtrace,
    error_stack,
    call_stack,
    error_date,
    oracle_execute_user,
    um_id)
  VALUES
   (v_log_info.error_log_id,
    v_log_info.owner,
    v_log_info.package_name,
    v_log_info.procedure_name,
    v_log_info.error_comment,
    v_log_info.error_backtrace,
    v_log_info.error_stack,
    v_log_info.call_stack,
    v_log_info.error_date,
    v_log_info.oracle_execute_user,
    v_log_info.um_id);

  COMMIT;
 END exception_handle;
END pkg_ods_error_handle;

3.3 测试程序

演示报错:违反唯一性约束

stu_info:

CREATE TABLE odsdata.stu_info (
 sno  NUMBER(10) CONSTRAINT pk_si_sno PRIMARY KEY,
 sname VARCHAR2(50) NOT NULL
);

GRANT SELECT, INSERT, UPDATE ON odsdata.stu_info TO odscde;

INSERT INTO odsdata.stu_info(sno, sname) VALUES(1, '瑶瑶');
COMMIT;

package:

CREATE OR REPLACE PACKAGE odscde.pkg_ods_error_test AS
 PROCEDURE ods_error_test(o_flag  OUT VARCHAR2,
              o_message OUT VARCHAR2);
END pkg_ods_error_test;

package body:

CREATE OR REPLACE PACKAGE BODY odscde.pkg_ods_error_test AS
 PROCEDURE ods_error_test(o_flag  OUT VARCHAR2,
              o_message OUT VARCHAR2) IS
  i_procedure_name VARCHAR2(30) := 'ods_error_test';
 BEGIN
  INSERT INTO odsdata.stu_info (sno, sname) VALUES (1, '瑶瑶');
  COMMIT;

  o_flag  := 'Y';
  o_message := '执行成功!';
 EXCEPTION
  WHEN OTHERS THEN
   o_flag  := 'N';
   o_message := '执行失败!';
   pkg_ods_error_handle.exception_handle(i_procedure_name => i_procedure_name,
                      i_error_comment => '' -- 关键入参、出参
                      );
 END ods_error_test;
END pkg_ods_error_test;

到此这篇关于Oracle 错误日志表及异常处理包详解 附源码的文章就介绍到这了,更多相关Oracle 错误日志表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Oracle自定义异常示例

    1.弹出错误框: 示例代码: declare v_count number; begin select count(*) into v_count from dept; if v_count < 10 then raise_application_error(-20001,'数量小于10'); end if; end; 执行结果: 2.控制台显示: 示例代码: declare v_count number; my_exp exception; begin select count(*) into

  • win7安装oracle10g 提示程序异常终止 发生未知错误

    oracle 10g 在win7下安装,选择高级选项,提示程序异常终止,发生未知错误 修改Oracle 10G\database\stage\prereq\db\refhost.xml 在 </SYSTEM> <CERTIFIED_SYSTEMS>后面添加 <!--Microsoft Windows 7--> <OPERATING_SYSTEM> <VERSION VALUE="6.1"/> </OPERATING_SY

  • 解决python3捕获cx_oracle抛出的异常错误问题

    最近一直在用python写点监控oracle的程序,一直没有用到异常处理这一块,然后日常监控中一些错误笼统的抛出数据库连接异常,导致后续处理的时候无法及时定位问题. 于是早上抽点时间看了下python3关于cx_oracle的异常处理形式. 其实,我只是想在python抛出oracle错误的时候,捕获到具体ora-信息. 写法很简单,这里记录下,以备后用. try: oracle_check(dbname) except cx_Oracle.DatabaseError as msg: print

  • oracle异常(预定义异常,自定义异常)应用介绍

    在开发过程中,经常会遇到一些测试,这时候就会想了解测试的过程,然后再根据过程分析代码错在哪里,这种情况下,就需要用到自定义异常,需要了解的朋友可以参考本文 先声明一个异常 Java代码 biz_exception exception; 再抛出来 Sql代码 复制代码 代码如下: p_RETCODE := '-1'; p_retInfo := '已生成工资+社保类型账单,请不要重复生成.'; raise biz_exception; 这样存储过程就走到最后的抓取异常地方 Sql代码 复制代码 代码

  • Oracle中RAISE异常深入分析

    有三种方式抛出异常 1.通过PL/SQL运行时引擎 2.使用RAISE语句 3.调用RAISE_APPLICATION_ERROR存储过程 当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出.异常也可以通过RAISE语句抛出 RAISE exception_name; 显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常.例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在

  • Oracle 错误日志表及异常处理包详解 附源码

    1 概述 1. 目的:'快速定位程序异常' 2. 包处理的核心思想:'自治事务' -- 自治事务的 "提交.回滚" 与 主事务 之间互不影响 3. 错误异常记录逻辑大体一致,此处记录,方便需要使用时复制.粘贴 4. 验证思路:通过执行报错的过程,观察 '程序执行结果' 和 '日志表' 数据插入情况 2 效果演示 程序执行截图: 日志表查询截图: 3 源码 说明: 1. 测试中,共有 2 个用户 -- 模拟实际开发场景 (1) odsdata: 存放业务数据 (2) odscde : 执

  • C语言实现扫雷游戏详解(附源码)

    目录 1.游戏的功能 2.游戏实现的基本思路 2.1实现菜单给玩家选择 2.2初始化棋盘 2.3数组大小的问题 2.4对棋盘赋值 2.5打印棋盘 2.6布置雷 2.7排查雷 3.代码基本实现部分 3.1主函数部分 3.2 初始化棋盘 3.3对两个棋盘进行赋值 3.4打印棋盘 3.5布置雷 3.6排查雷  3.7函数声明 4.扫雷游戏的源代码 总结 1.游戏的功能 游戏的主要功能有 1:棋盘内有若干个雷 2:玩家输入要排查雷的坐标 3:在玩家输入的坐标处显示周围八个坐标有几个雷 3:若玩家将所有的

  • Python7个爬虫小案例详解(附源码)中篇

    目录 前言 题目三: 分别使用XPath和Beautiful Soup4两种方式爬取并保存非异步加载的“豆瓣某排行榜”如https://movie.douban.com/top250的名称.描述.评分和评价人数等数据 题目四: 实现某东商城某商品评论数据的爬取(评论数据不少于100条,包括评论内容.时间和评分) 本次的7个python爬虫小案例涉及到了re正则.xpath.beautiful soup.selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习. 前言 关于Pyth

  • Python7个爬虫小案例详解(附源码)上篇

    目录 前言 题目一: 使用正则表达式和文件操作爬取并保存“百度贴吧”某帖子全部内容(该帖不少于5页) 题目二: 实现多线程爬虫爬取某小说部分章节内容并以数据库存储(不少于10个章节) 本次的7个python爬虫小案例涉及到了re正则.xpath.beautiful soup.selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习. 前言 关于Python7个爬虫小案例的文章分为三篇,本篇为上篇,共两题,其余两篇内容请关注! 题目一: 使用正则表达式和文件操作爬取并保存“百度贴吧

  • Android编程单元测试实例详解(附源码)

    本文实例讲述了Android编程单元测试.分享给大家供大家参考,具体如下: 完整实例代码代码点击此处本站下载. 本文是在上一篇文章<java编程之单元测试(Junit)实例分析>的基础上继续讲解android的单元测试,android源码中引入了java单元测试的框架(android源码目录:libcore\junit\src\main\java\junit\framework中可见),然后在java单元测试框架的基础上扩展属于android自己的测试框架.android具体框架类的关系图如下

  • Android未读消息拖动气泡示例代码详解(附源码)

    前言 拖动清除未读消息可以说在很多应用中都很常见,也被用户广泛接受.本文是一个可以供参考的Demo,希望能有帮助. 提示:以下是本篇文章正文内容,下面案例可供参考 最终效果图及思路 实现关键: 气泡中间的两条边,分别是以ab,cd为数据点,G为控制点的贝塞尔曲线. 步骤: 绘制圆背景以及文本:连接情况绘制贝塞尔曲线:另外端点绘制一个圆 关键代码 1.定义,初始化等 状态:静止.连接.分离.消失 在onSizeChanged中初始化状态,固定气泡以及可动气泡的圆心 代码如下(示例): @Overr

  • Android编程实现泡泡聊天界面实例详解(附源码)

    本文实例讲述了Android编程实现泡泡聊天界面的方法.分享给大家供大家参考,具体如下: 昨天写了个界面,实现了Android泡泡聊天界面.运行结果如下,点击发送按钮,屏幕就显示Text的内容. 我也是在网上的一份源码的基础上更改的,整个泡泡界面的实现要点: (1)主界面其实就是一个List View (2)文字显示界面其实就使用了android:background="@drawable/incoming"这个东西.背景图片的格式是xxx.9.png,专门用来缩放的,不然显示效果非常

  • android编程之XML文件解析方法详解(附源码)

    本文实例讲述了android编程之XML文件解析方法.分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8

  • 微信小程序 省市区选择器实例详解(附源码下载)

    微信小程序 省市区选择器:       最近学习微信小程序,为了检验自己的学习效果,自己做一个小示例,网上搜索下类似的实例,发现这个更好,大家看下. 一.区域间手势滑动切换,标题栏高亮随之切换 思路是:拿当前的current来决定高亮样式 1.监听swiper滚动到的位置: <swiper class="swiper-area" current="{{current}}" bindchange="currentChanged"> cu

  • Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)

    本文实例讲述了Android编程之ICS式下拉菜单PopupWindow实现方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 右边这个就是下拉菜单啦,看见有的地方叫他 ICS式下拉菜单,哎哟,不错哦! 下面先讲一下实现原理: 这种菜单实际上就是一个弹出式的菜单,于是我们想到android PopupWindow 类,给他设置一个view 在弹出来不就OK了吗. PopupWindow 的用法也很简单 主要方法: 步骤1.new 一个实例出来,我们使用这个构造方法即可, 复制代码 代码如

随机推荐