程序中通常都要实现日志记录功能,尤其是事务发生报错时的错误日志。如果把日志记录在数据库中,可以方便后续的查询和分析。但是如果直接把记录日志的共能写在事务中,如果事务发生ROLLBACK,记录的日志也会发生ROLLBACK,明显时不合适的。但是使用自治事务可以很方便的实现日志记录功能,并且不会受主事务的影响。下面实现一个简单的日志记录例子。
1. 创建日志记录表
点击(此处)折叠或打开
-
create table logtab (
- code integer,
- text varchar2(4000),
- created_on date,
- created_by varchar2(50),
- changed_on date,
- changed_by varchar2(50)
- );
2. 创建记录日志的package
创建日志包可以方便统一管理日志记录,并且可以实现自治事务。
log package 包含两个procedure:putline和saveline,putline实现日志插入,saveline时一个自治事务,调用putline。在程序中记录日志时可以直接调用saveline实现。
点击(此处)折叠或打开
-
create or replace package log
- is
- procedure putline(code_in in integer, text_in in varchar2);
- procedure saveline(code_in in integer, text_in in varchar2);
- end log;
- /
- create or replace package body log
- is
- procedure putline(
- code_in in integer,text_in in varchar2)
- is
- begin
- insert into logtab
- values(code_in,text_in,sysdate,user,sysdate,user);
- end;
- procedure saveline(
- code_in in integer,text_in in varchar2)
- is
- pragma autonomous_transaction;
- begin
- putline(code_in, text_in);
- commit;
- exception when others then rollback;
- end;
- end log;
- /
3. 一个简单的例子
选择一个不存在的数据,查看logtab里的记录
点击(此处)折叠或打开
-
declare
- sal pls_integer;
- begin
- select salary into sal from employees where employee_id = 11111;
- exception
- when others
- then sys.log.saveline(sqlcode,sqlerrm);
- end;
- /
查看logtab里的记录
点击(此处)折叠或打开
-
select * from logtab;
- CODE TEXT CREATED_O CREATE_BY CHANGE_ON CHANGE_BY
- ———- —————————— ——— ———- ——— ———-
- 100 ORA–01403: no data found 10–JUN–18 SYS 10–JUN–18 SYS