oracle中怎么建立日志表,怎么在Oracle中创建一个错误日志表
怎么在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中创建一个错误日志表相关推荐
- django异常日志_【python小随笔】Django+错误日志(配置Django报错文件指定位置)...
1: 自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 #1定义一个日志文件 创建一个操作日志对象logger file_1= logging.FileHandler ...
- Java数据结构与算法———(55)创建一个哈希表
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址-),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希 ...
- oracle 快速复制一张表,并在此创建索引,日志及并行度
复制表结构及其数据 create table table_name_new as select * from table_name_old 只复制表结构 create table table_name ...
- 创建一个学生信息表,与页面分离
一.需求分析 做一个jsp页面,动态显示信息表的内容. 1. 做一个实体类:StudentInfo (包含4个字段) 2. 如图模拟生成3条数据,本质上就是new StudentInfo 3个实例 ...
- mysql创建教师表_day34 mysql 认识数据库,创建学生,教师,学院表
数据库 - 数据的仓库(集散地) - database - 实现数据持久化和数据管理 持久化 - 将数据从内存转移到能够长久保存数据的存储介质的过程 数据库的分类:关系型数据库(SQL)和非关系型数据 ...
- 日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用
winston 被设计为一个简单且通用的日志库,支持多种传输. 传输本质上是日志的存储设备. 每个 winston 记录器都可以在不同级别配置多个存储渠道.例如,人们可能希望将错误日志存储在持久的远程 ...
- 计算机excel求某班英语成绩单,用Excel创建一个学生成绩表,要按照班级统计出某门课程的平均分,需要使用的方式是()...
考生文件夹下有一个数据库文件"samp2.accdb",其中已经设计好三个关联表对象"tStud"."tCourse"."t 考生 ...
- 一个错误日志记录工具类
package com.moxiu.downloader.util;/*** 当程序发生Uncaught异常的时候,有该类来接管程序,并记录错误日志* Created by ZGP on 2017/7 ...
- 在python中元素是无序不重复的_set()函数~~创建一个无序不重复元素集
set()函数~~创建一个无序不重复元素集 2020-08-11 11:49常用函数 本篇文章里小编给大家分享了关于Python中set()函数的相关知识点内容,set() 函数用于创建一个无序不重复 ...
- python场景建立_Python创建一个街道地址表-问答-阿里云开发者社区-阿里云
首先,你应该转换givenNumber成int()因为input()总是返回字符串.此外,您可以将整体strAddress转换为自身并反转自身版本,以便更轻松地访问它.splitAddress这里不需 ...
最新文章
- 用Python发一个高逼格的朋友圈
- Hinge Loss
- TypeScript 里的 class field
- C语言 | 6种常用的转换工具函数盘点
- python时间去掉t_Python的set集合详解
- 加密和解密算法的兩個實現
- CSS3 之 flex
- 【转载】 C#中使用Sum方法对List集合进行求和操作
- node-sass 安装失败,原因总结
- mysql--sql中双引号 单引号' 反单引号`的作用和区别
- Linux PostgreSQL离线下载与安装
- 【092】韦达定理在一元n次方程中的推广
- java实现rabbitmq_RabbitMQ搭建(2)-Java简单实现
- Python模拟Tim登录界面
- 分布式全局唯一ID生成算法(改进的雪花算法——解决时钟回拨问题)
- Apache HAWQ集群的安装部署
- 猫狗大战——基于TensorFlow的猫狗识别(2)
- Chrome浏览器全球大翻车? 让20多亿用户无网可上
- [第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇]Android 应用程序定制方案(生活类)...
- 【高阶数据结构】手撕红黑树(超详细版本)
热门文章
- python学习资源分享
- php比较输入数字大小,jquery怎么比较两个数字大小
- mysql innodb count 优化_MySQL · 引擎特性 · InnoDB COUNT(*) 优化(?)
- 计算机课程新讨论话题,信息技术组内主题讨论-.DOC
- 考研南邮和杨大计算机,江苏省这4所“非211”低调有实力,从不争名次,毕业生颇受欢迎...
- 物体检测算法:R-CNN,SSD,YOLO 动手学深度学习v2 pytorch
- 自动驾驶1-1 欢迎来到自动驾驶汽车专业 Welcome to the Self-Driving Cars Specialization
- 12月21诛仙服务器维护,1月21日全服停机更新维护公告
- java生成gif_Java生成动态GIF图片
- Rotate Array旋转数组