怎么查看oracle数据库的全局临时表是否正确的插入了数据

今天遇到一个这样的问题,程序中有一个用来存储程序报错信息的临时表,就是每次当程序运行出错的时候,就会将相应的报错信息插入到临时表中,然后调用临时表中的数据在界面上显示给用户,然后今天出现的问题是,报错的界面出现了,但是没有正确的显示出报错信息,而是一片空白。在这个问题情景下,我就有了一个想知道数据是否正确插入到了临时表,但是我们都知道临时表是session级的,一个session是无法查看到另一个session临时表的数据的,所以,问题也就来了。本文就这个问题,提供下面的这种处理思路,如果你对oracle中的临时表还不是特别了解,可以先参考下博客中《oracle临时表用法小结》这篇文章。

1、创建临时表

为了方便后面写代码,先把临时表的结构表示出来,可以看下面的这段创建临时表的代码。

-- 创建临时表
CREATE GLOBAL TEMPORARY TABLE CMX_ERRORS_TMP
(
  SEQ_NUM          NUMBER,
  ERROR_SOURCE     VARCHAR2(100),
  ERROR_MESSAGE    VARCHAR2(4000),
  CREATION_DATE    DATE DEFAULT SYSDATE NOT NULL,
  CREATED_BY       NUMBER DEFAULT -1 NOT NULL,
  DESCRIPTION      VARCHAR2(100)
)
ON COMMIT PRESERVE ROWS;

2、创建一个和临时表结构一样的普通表

创建一个普通表,用来存储临时表中的记录。

-- 创建一个普通表
CREATE TABLE cmx_tmp_bak AS SELECT * FROM cmx_errors_tmp WHERE 1 = 0;

3、在临时表上创建一个触发器

在临时表上面创建一个触发器,以实现每当往临时表中插入一条记录的时候,同时也将这条记录插入到前面建的那个普通表中。

-- 创建before insert触发器
CREATE OR REPLACE TRIGGER cmx_errors_bak_trigger
  BEFORE INSERT ON cmx_errors_tmp
  FOR EACH ROW
BEGIN
  INSERT INTO cmx_tmp_bak
    (seq_num, error_source, error_message, creation_date, created_by, description)
  VALUES
    (:new.seq_num, :new.error_source, :new.error_message, :new.creation_date, :new.created_by, :new.description,);
END;

这里有个地方需要注意的是,oracle不允许在触发器中加commit和rollback。

4、测试

insert几条记录到cmx_errors_tmp表,先不写commit,查询cmx_tmp_bak,会发现没有插入数据进来。现在加上commit,再查询cmx_tmp_bak表,发现数据插入进来了。想想为什么?

原理上来说,根据上面的做法就已经将记录插入到了备份表中,但是你会发现你打开一个会话,然后select查询这个备份表,却依然可能没有看到有数据插入进来,我也遇到了这个问题,后来发现我在插入数据到临时表的时候,并没有加commit操作,而且在触发器中也是不能加commit提交的,那么在没有commit的情况,我新建一个session来查询,这个时候数据并没有被写入数据库,所以是查不到的。后来,我在插入错误数据到临时表的代码中加了commit操作,然后再次查询备份表,发现数据正确的插入进来了。

上面只是实现了insert的备份,如果你要实现更多的操作,比如delete、update,也可以相应的做一些修改,可以同时参考《oracle临时表用法小结》这篇文章。

本文标题:怎么查看oracle数据库的全局临时表是否正确的插入了数据

本文链接:http://yedward.net/?id=187

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章