千家信息网

ORACLE PL/SQL 利用自治事务实现日志记录

发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,程序中通常都要实现日志记录功能,尤其是事务发生报错时的错误日志。如果把日志记录在数据库中,可以方便后续的查询和分析。但是如果直接把记录日志的共能写在事务中,如果事务发生ROLLBACK,记录的日志也会
千家信息网最后更新 2025年01月27日ORACLE PL/SQL 利用自治事务实现日志记录程序中通常都要实现日志记录功能,尤其是事务发生报错时的错误日志。如果把日志记录在数据库中,可以方便后续的查询和分析。但是如果直接把记录日志的共能写在事务中,如果事务发生ROLLBACK,记录的日志也会发生ROLLBACK,明显时不合适的。但是使用自治事务可以很方便的实现日志记录功能,并且不会受主事务的影响。下面实现一个简单的日志记录例子。

1. 创建日志记录表

点击(此处)折叠或打开

  1. create table logtab (
  2. code integer,
  3. text varchar2(4000),
  4. created_on date,
  5. created_by varchar2(50),
  6. changed_on date,
  7. changed_by varchar2(50)
  8. );
2. 创建记录日志的package

创建日志包可以方便统一管理日志记录,并且可以实现自治事务。
log package 包含两个procedure:putline和saveline,putline实现日志插入,saveline时一个自治事务,调用putline。在程序中记录日志时可以直接调用saveline实现。

点击(此处)折叠或打开

  1. create or replace package log
  2. is
  3. procedure putline(code_in in integer, text_in in varchar2);
  4. procedure saveline(code_in in integer, text_in in varchar2);
  5. end log;
  6. /

  7. create or replace package body log
  8. is
  9. procedure putline(
  10. code_in in integer,text_in in varchar2)
  11. is
  12. begin
  13. insert into logtab
  14. values(code_in,text_in,sysdate,user,sysdate,user);
  15. end;

  16. procedure saveline(
  17. code_in in integer,text_in in varchar2)
  18. is
  19. pragma autonomous_transaction;
  20. begin
  21. putline(code_in, text_in);
  22. commit;
  23. exception when others then rollback;
  24. end;
  25. end log;
  26. /
3. 一个简单的例子

选择一个不存在的数据,查看logtab里的记录

点击(此处)折叠或打开

  1. declare
  2. sal pls_integer;
  3. begin
  4. select salary into sal from employees where employee_id = 11111;
  5. exception
  6. when others
  7. then sys.log.saveline(sqlcode,sqlerrm);
  8. end;
  9. /
查看logtab里的记录

点击(此处)折叠或打开

  1. select * from logtab;

  1. CODE TEXT CREATED_O CREATE_BY CHANGE_ON CHANGE_BY
  2. ---------- ------------------------------ --------- ---------- --------- ----------
  3. 100 ORA-01403: no data found 10-JUN-18 SYS 10-JUN-18 SYS







0