程序中通常都要实现日志记录功能,尤其是事务发生报错时的错误日志。如果把日志记录在数据库中,可以方便后续的查询和分析。但是如果直接把记录日志的共能写在事务中,如果事务发生ROLLBACK,记录的日志也会发生ROLLBACK,明显时不合适的。但是使用自治事务可以很方便的实现日志记录功能,并且不会受主事务的影响。下面实现一个简单的日志记录例子。
1. 创建日志记录表 点击(此处)折叠或打开
目前创新互联已为1000多家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、安泽网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
-
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
分享名称:ORACLEPL/SQL利用自治事务实现日志记录
文章来源:
http://cdkjz.cn/article/jdgdoh.html