oracle使用自治事务记录系统日志-阿里云开发者社区

开发者社区> rudy_gao> 正文

oracle使用自治事务记录系统日志

简介: 在我们对表记录执行DML操作时,一方面,我们需要把错误记录到数据库的日志表中,另一方面,由于错误我们需要回滚核心事务,此时我们可以在记录日志的存储过程中使用自治事务 1.
+关注继续查看

在我们对表记录执行DML操作时,一方面,我们需要把错误记录到数据库的日志表中,另一方面,由于错误我们需要回滚核心事务,此时我们可以在记录日志的存储过程中使用自治事务

1. 定义事务日志表

CREATE TABLE "SCOTT"."EXCEPTION_LOG" 
   (	"ID" NUMBER(18,0), 
	"ERROR_CODE" NUMBER(10,0), 
	"ERROR_MESSAGE" VARCHAR2(2000), 
	"CREATE_TIME" TIMESTAMP (6) DEFAULT Sysdate, //使用系统时间定义日志被创建时间
	"DESCRIPTION" VARCHAR2(500), 
	"EXCEPTION_LEVEL" VARCHAR2(30)
   )


 

2. 定义两个表USERS表各USERS_TEST表,其中业务逻辑为把USERS_TEST表中数据复制到users表中,如果users_test表中username在users中的username列不存在,则把记录插入users表中,如果存在,则把重复记录的日志记录到exception_log表中,如果有其它的异常,则回滚插入记录,但不回滚日志记录

CREATE TABLE "SCOTT"."USERS" 
   (	"USER_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"USERNAME" VARCHAR2(30) NOT NULL ENABLE, 
	"PASSWORD" VARCHAR2(50) NOT NULL ENABLE, 
	 CONSTRAINT "UNIQUE_NAME" UNIQUE ("USERNAME") //定义唯一约束在此列上
)


 

CREATE TABLE "SCOTT"."USERS_TEST" 
   (	"USER_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"USERNAME" VARCHAR2(30) NOT NULL ENABLE, 
	"PASSWORD" VARCHAR2(50) NOT NULL ENABLE
   )

3. 定义记录日志包

CREATE OR REPLACE PACKAGE system_log IS

  PROCEDURE exception_log(ERROR_CODE      IN NUMBER,
                          error_message   IN VARCHAR2,
                          exception_level IN VARCHAR2,
                          description     IN VARCHAR2);

END system_log;


                        

 

CREATE OR REPLACE PACKAGE BODY system_log IS

  PROCEDURE exception_log(ERROR_CODE      IN NUMBER,
                          error_message   IN VARCHAR2,
                          exception_level IN VARCHAR2,
                          description     IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION; //声明自治事务
  BEGIN
    INSERT INTO exception_log
      (ERROR_CODE, error_message, exception_level, description)
    VALUES
      (ERROR_CODE, error_message, exception_level, description);
      COMMIT; //提交事务,记得一定要提交,否则会报异常
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('can not insert log in exception_log table, error message is:' ||
                           dbms_utility.format_error_backtrace);
  END exception_log;

END system_log;


 

4. 定义转储users_test和users表中的数据

CREATE OR REPLACE PROCEDURE prc_unique_user(id NUMBER) IS
  CURSOR user_cursor IS
    SELECT * FROM users_test WHERE user_id > id;
BEGIN
  FOR uc IN user_cursor
  LOOP
    BEGIN
      INSERT INTO users
        (username, password)
      VALUES
        (uc.username, uc.password);
    EXCEPTION
      WHEN dup_val_on_index THEN
      
        DECLARE
          sql_code NUMBER := SQLCODE;
        BEGIN
          system_log.exception_log(sql_code,
                                   dbms_utility.format_error_stack ||
                                   ', error line:' ||
                                   dbms_utility.format_error_backtrace,
                                   'warn',
                                   '插入重复的username在users表中,username是:' ||
                                   uc.username || ',行号user_id是:' ||
                                   uc.user_id);
        END;
        dbms_output.put_line('插入重复的username在users表中,username是:' ||
                             uc.username || ',行号user_id是:' || uc.user_id);
        ROLLBACK;
    END;
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    dbms_output.put_line('插入user表中出现了其它异常' ||
                         dbms_utility.format_error_backtrace);
END prc_unique_user;


 

 


 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle中常用系统表
dba_开头..... dba_users 数据库用户信息 dba_segments 表段信息 dba_extents 数据区信息 dba_objects 数据库对象信息 dba_tablespaces 数据库表空间信息 dba_data_files 数据文件设置信息 dba_temp_files 临时数据文件信息 d
1084 0
理解和使用Oracle分析工具LogMiner
用LogMiner             理解和使用Oracle   8i分析工具LogMiner                 Oracle   LogMiner   是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle   重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert、update、delete等)语句,另外还可分析得到一些必要的回滚SQL语句。
1174 0
oracle查看系统存储过程
select line,text from dba_source where name='PRO_E_F_ORDER_STAT'; select object_name,object_typ...
417 0
Typora侧边栏的大纲视图折叠( win系统 )
Typora侧边栏的大纲视图折叠( win系统 )
309 0
系统日志文件
常见日志文件 /var/log/boot.log 开机启动的时候系统内核会去检测与启动硬件,接下来开始启动各种内核支持得功能等。这些流程都会记录在/var/log/boot.log 里面。不过这个文件只会存储本次开机启动的信息,之前的启动信息并不会保留下来 /var/log/cron c.
1279 0
ELK日志分析系统迁移记录
写在开始 阿里云ECS即将到期,由于之前ELK日志分析是在自己的服务器上进行试水,断断续续运行了一年多时间。 今天抽空赶紧把ELK迁移一下,由于Logstash本身就配置于各个系统之中,所以这里只是对Redis、Elasticsearch和Kibana进行了配置,当然还有一些邮件发送的配置。
3439 0
Oracle中会话与事务有什么区别?
        一个会话可以启动多个事务,会话是session,指一次连接。         事务是指一个操作单元,要么成功,要么失败,没有中间状态。         会话中可以完成多个事务。 例如:         会话好比,在应用程序中连接数据库要执行连接,然后会关闭,这算一次会话。         事务呢,就好比在打开会话后要执行程序中的某一个或多个对数据库进行的操作。
702 0
MyBatis Generator(MBG)Oracle使用说明 公共同义词 LONG数据类型
Oracle使用说明公共同义词 Public Synonyms如果要为具有公共同义词的表生成对象,则应该实际上根据真实表生成对象,然后在运行时更改表名称。MyBatis Generator自动支持。
912 0
+关注
487
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载