温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-12-19 14:21:29 来源:亿速云 阅读:278 作者:Leah 栏目:开发技术

怎么在Oracle中创建一个错误日志表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1 概述

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

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

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

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

2 效果演示

程序执行截图:

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

日志表查询截图:

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

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;

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI