怎么在Oracle中创建一个错误日志表

发布时间:2020-12-19 14:21:29

来源:亿速云

阅读:71

作者:Leah

怎么在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中创建一个错误日志表相关推荐

  1. django异常日志_【python小随笔】Django+错误日志(配置Django报错文件指定位置)...

    1:  自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 #1定义一个日志文件 创建一个操作日志对象logger file_1= logging.FileHandler ...

  2. Java数据结构与算法———(55)创建一个哈希表

    有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址-),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希 ...

  3. oracle 快速复制一张表,并在此创建索引,日志及并行度

    复制表结构及其数据 create table table_name_new as select * from table_name_old 只复制表结构 create table table_name ...

  4. 创建一个学生信息表,与页面分离

    一.需求分析 做一个jsp页面,动态显示信息表的内容. 1.  做一个实体类:StudentInfo (包含4个字段) 2.  如图模拟生成3条数据,本质上就是new StudentInfo 3个实例 ...

  5. mysql创建教师表_day34 mysql 认识数据库,创建学生,教师,学院表

    数据库 - 数据的仓库(集散地) - database - 实现数据持久化和数据管理 持久化 - 将数据从内存转移到能够长久保存数据的存储介质的过程 数据库的分类:关系型数据库(SQL)和非关系型数据 ...

  6. 日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用

    winston 被设计为一个简单且通用的日志库,支持多种传输. 传输本质上是日志的存储设备. 每个 winston 记录器都可以在不同级别配置多个存储渠道.例如,人们可能希望将错误日志存储在持久的远程 ...

  7. 计算机excel求某班英语成绩单,用Excel创建一个学生成绩表,要按照班级统计出某门课程的平均分,需要使用的方式是()...

    考生文件夹下有一个数据库文件"samp2.accdb",其中已经设计好三个关联表对象"tStud"."tCourse"."t 考生 ...

  8. 一个错误日志记录工具类

    package com.moxiu.downloader.util;/*** 当程序发生Uncaught异常的时候,有该类来接管程序,并记录错误日志* Created by ZGP on 2017/7 ...

  9. 在python中元素是无序不重复的_set()函数~~创建一个无序不重复元素集

    set()函数~~创建一个无序不重复元素集 2020-08-11 11:49常用函数 本篇文章里小编给大家分享了关于Python中set()函数的相关知识点内容,set() 函数用于创建一个无序不重复 ...

  10. python场景建立_Python创建一个街道地址表-问答-阿里云开发者社区-阿里云

    首先,你应该转换givenNumber成int()因为input()总是返回字符串.此外,您可以将整体strAddress转换为自身并反转自身版本,以便更轻松地访问它.splitAddress这里不需 ...

最新文章

  1. 用Python发一个高逼格的朋友圈
  2. Hinge Loss
  3. TypeScript 里的 class field
  4. C语言 | 6种常用的转换工具函数盘点
  5. python时间去掉t_Python的set集合详解
  6. 加密和解密算法的兩個實現
  7. CSS3 之 flex
  8. 【转载】 C#中使用Sum方法对List集合进行求和操作
  9. node-sass 安装失败,原因总结
  10. mysql--sql中双引号 单引号' 反单引号`的作用和区别
  11. Linux PostgreSQL离线下载与安装
  12. 【092】韦达定理在一元n次方程中的推广
  13. java实现rabbitmq_RabbitMQ搭建(2)-Java简单实现
  14. Python模拟Tim登录界面
  15. 分布式全局唯一ID生成算法(改进的雪花算法——解决时钟回拨问题)
  16. Apache HAWQ集群的安装部署
  17. 猫狗大战——基于TensorFlow的猫狗识别(2)
  18. Chrome浏览器全球大翻车? 让20多亿用户无网可上
  19. [第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇]Android 应用程序定制方案(生活类)...
  20. 【高阶数据结构】手撕红黑树(超详细版本)

热门文章

  1. python学习资源分享
  2. php比较输入数字大小,jquery怎么比较两个数字大小
  3. mysql innodb count 优化_MySQL · 引擎特性 · InnoDB COUNT(*) 优化(?)
  4. 计算机课程新讨论话题,信息技术组内主题讨论-.DOC
  5. 考研南邮和杨大计算机,江苏省这4所“非211”低调有实力,从不争名次,毕业生颇受欢迎...
  6. 物体检测算法:R-CNN,SSD,YOLO 动手学深度学习v2 pytorch
  7. 自动驾驶1-1 欢迎来到自动驾驶汽车专业 Welcome to the Self-Driving Cars Specialization
  8. 12月21诛仙服务器维护,1月21日全服停机更新维护公告
  9. java生成gif_Java生成动态GIF图片
  10. Rotate Array旋转数组