一、基于会话的临时表

--建立基于会话的临时表要记得关键字global temporary,及on commit preserve rows(基于会话)

CREATE GLOBAL TEMPORARY TABLE TEMP_SESSION(COL1 TYPE1) ON COMMIT PRESERVE ROWS;


SQL> create global temporary table ljb_tmp_session on commit preserve rows as select * from dba_objects where 1=2;

Table created


--通过以下可看出当前表的属性为全局临时表,类型为基于会话


SQL> select table_name,temporary,duration from user_tables where table_name='LJB_TMP_SESSION';

TABLE_NAME TEMPORARY DURATION

------------------------------ --------- ----------------------------------------------------

LJB_TMP_SESSION Y SYS$SESSION


二、基于事物的临时表

--建立基于会话的临时表要记得关键字global temporary,及on commit delete rows(基于事务)

CREATE GLOBAL TEMPORARY TABLE Table_TRANSACTION(COL1 TYPE1) ON COMMIT DELETE ROWS;


SQL> create global temporary table ljb_tmp_transaction on commit delete rows as select * from dba_objects where 1=2;

Table created


--通过以下可看出当前表的属性为全局临时表,类型为基于事务


SQL> select table_name, temporary, DURATION from user_tables where table_name='LJB_TMP_TRANSACTION';

TABLE_NAME TEMPORARY DURATION

------------------------------ --------- --------------------------------------------------------

LJB_TMP_TRANSACTION Y SYS$TRANSACTION



无论是基于事务还是基于会话的临时表,对于其他SESSION都是不可见的,换句话说数据只存在于当前SESSION中。基于事务的临时表,在本SESSION中有任何提交动作,数据也就立即消失了,基于会话的临时表在SESSION生存期内提交数据仍然存在,并且可以回滚,没脱离SESSION和普通表的操作没有什么区别。


三、区别:

1、会话级临时表:临时表的数据和当前会话有关,当你的SESSION不退出时,临时表的数据就存在,退出或断开session时数据别截断。当你以另一SESSION登陆时,不能看到其他SESSION临时表的数据。创建方法

CREATE GLOBAL TEMPORARY TABLE TEMP_SESSION(COL1 TYPE1) ON COMMIT PRESERVE ROWS;

2、事物级临时表:临时表与事物有关,当事物进行提交或回滚时,临时表数据自动截断。其他和会话级临时表一直,包括退出SESSION时截断表。

CREATE GLOBAL TEMPORARY TABLE Table_TRANSACTION(COL1 TYPE1) ON COMMIT DELETE ROWS;

3、两种类型临时表的区别:会话级临时表采用on commit preserve rows;而事务级则采用on commit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commit、rollback或者是会话结束,临时表中的数据都将被截断。


总结可以这样认为:如果应用很简单,不要对临时表做多次组合处理,比如合并,删除等多次操作,就采用基于事物的,更简单!如果有涉及到对临时表要做组合操作的,就必须选择基于会话的临时表,选错了就会在组合操作中数据丢失,出大问题了!