今天遇到一个这样的问题,程序中有一个用来存储程序报错信息的临时表,就是每次当程序运行出错的时候,就会将相应的报错信息插入到临时表中,然后调用临时表中的数据在界面上显示给用户,然后今天出现的问题是,报错的界面出现了,但是没有正确的显示出报错信息,而是一片空白。在这个问题情景下,我就有了一个想知道数据是否正确插入到了临时表,但是我们都知道临时表是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 ROWBEGIN 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。
|