程序中通常都要实现日志记录功能,尤其是事务发生报错时的错误日志。如果把日志记录在数据库中,可以方便后续的查询和分析。但是如果直接把记录日志的共能写在事务中,如果事务发生ROLLBACK,记录的日志也会发生ROLLBACK,明显时不合适的。但是使用自治事务可以很方便的实现日志记录功能,并且不会受主事务的影响。下面实现一个简单的日志记录例子。
-
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