程序中通常都要实现日志记录功能,尤其是事务发生报错时的错误日志。如果把日志记录在数据库中,可以方便后续的查询和分析。但是如果直接把记录日志的共能写在事务中,如果事务发生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 datafound 10-JUN-18 SYS 10-JUN-18 SYS