程序中通常都要實現日志記錄功能,尤其是事務發生報錯時的錯誤日志。如果把日志記錄在數據庫中,可以方便后續的查詢和分析。但是如果直接把記錄日志的共能寫在事務中,如果事務發生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