oracle GLOBAL TEMPORARY 临时表

2、详细介绍
   会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
   事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
3、建立临时表
   临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效.
   建立方法:
1) ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法.
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
  2          (startdate DATE,
  3           enddate DATE,
  4           class CHAR(20))
  5        ON COMMIT DELETE ROWS; -- 事务级别
SQL> create table permernate( a number);
SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');
SQL> insert into permernate values(1);
SQL> commit; --事务提交
SQL> select * from admin_work_area; -- 从缓存表中查不到数据
SQL> select  * from permernate;
A(列名)
----------
1

2)ON COMMIT PRESERVE ROWS
会话1:
SQL> drop table admin_work_area;
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
  2          (startdate DATE,
  3           enddate DATE,
  4           class CHAR(20))
  5       ON COMMIT PRESERVE ROWS;
SQL> insert into permernate values(2);
SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');
SQL> commit; --提交事务
SQL> select * from permernate;
A(列明)
----------
1(事务性临时表例子中插入的数据)
2

SQL> select * from admin_work_area; --查询临时表有值,因为还在同一session中

STARTDATE  ENDDATE    CLASS
---------- ---------- --------------------
17-1?? -03 17-1?? -03 session temperary

会话2:
SQL> select * from permernate;
A
----
1
2
SQL> select * from admin_work_area; -- 每个会话只能看到自身的数据
未选择行.
会话2看不见会话1中临时表的数据.

总结:会话或事务性临时表用来定义会话时临时表中数据的生命周期。临时表结构对于每个session来说都可见,而数据是每个session一份,类似于java中的私有变量一样;
其实不用去特别的记忆,从名字上就可以区分,如下:
ON COMMIT DELETE ROWS : 表明提交的时候删除数据;
ON COMMIT PRESERVE ROWS :表明提交的时候保存数据;
所以,在一次会话中执行了commit语句后,从事务性临时表中获取不到数据,而从会话临时表中可以获取到数据,就像上面例子中的演示。

猜你喜欢

转载自harbey.iteye.com/blog/1667422