Oracle Temporary Tables临时表

创建临时表时,ORACLE只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会从当前用户的临时表空间分配一块内存空间。也就是说只有向临时表中插入数据时,才会给临时表分配存储空间。

 

临时表分事务级临时表和会话级临时表

1事务级临时表只对当前事务有效,通过语句:ON COMMIT DELETE ROWS 语句指定。 

CREATE GLOBAL TEMPORARY TABLE report_work_area 
(
  startdate DATE, 
  enddate DATE,

  class  CHAR(20)
) ON COMMIT DELETE ROWS;

COMMITROLLBACK之前,数据一直存在,当事务提交之后,表中数据自动清除

 

2会话级临时表对当前会话有效,通过语句:ON COMMIT PRESERVE ROWS语句指定。

CREATE GLOBAL TEMPORARY TABLE report_work_area 
(
  startdate DATE, 
  enddate DATE,

  class  CHAR(20)
) ON COMMIT PRESERVE ROWS;

当我们断开连接或手动执行DELETETRUNCATE之前,临时表中的数据一直存在,并且只有当前会话可以看到,其他会话看不到。当断开会话后,表中数据自动清除。

 

 

 

 

 

 

 

 

1.   简介 

   ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据, 

   或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空, 

   但是临时表的结构以及元数据还存储在用户的数据字典中。 

   临时表只在oracle8i以及以上产品中支持。 

 

2.  详细介绍 

   Oracle临时表分为 会话级临时表 和事务级临时表。 

会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。 

事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。 

临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此, 

临时表不需要DML.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的 

表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据

你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.  

临时表可以拥有触发器

 

3.    建立临时表 

   临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效

   建立方法

1) ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法

CREATE GLOBAL TEMPORARY TABLE admin_work_area 

        (startdate DATE, 

         enddate DATE, 

         class CHAR(20)) 

      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; 

2)ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法

CREATE GLOBAL TEMPORARY TABLE admin_work_area 

        (startdate DATE, 

         enddate DATE, 

         class CHAR(20)) 

     ON COMMIT PRESERVE ROWS; 

 

EXAMPLE: 

 

会话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; 

 

STARTDATE  ENDDATE    CLASS 

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

17-1?? -03 17-1?? -03 session temperary 

 

-- transaction level
CREATE GLOBAL TEMPORARY TABLE admin_work_area  
        (startdate DATE,  
         enddate DATE,  
         class CHAR(20))  
      ON COMMIT DELETE ROWS;  
create table permernate( a number);  
insert into admin_work_area values(sysdate,sysdate,'temperary table');  

insert into permernate values(1);  
select * from admin_work_area;  -- there's data
select  * from permernate;  --there's data 

commit;  

select * from admin_work_area;  -- there's NO data
select  * from permernate;  -- there's data
COMMIT;

 

 

 

会话2: 

 

SQL> select * from permernate; 

 

         A 

---------- 

         1 

         2 

 

SQL> select * from admin_work_area; 

 

未选择行

 

会话2看不见会话1中临时表的数据.  

 

 

会话1:

-------- session level
DROP TABLE admin_work_area  ;
CREATE GLOBAL TEMPORARY TABLE admin_work_area  
        (startdate DATE,  
         enddate DATE,  
         class CHAR(20))  
     ON COMMIT PRESERVE ROWS;  -- diff
     
INSERT INTO PERMERNATE VALUES (2);
INSERT INTO ADMIN_WORK_AREA VALUES  (SYSDATE, SYSDATE + 2, 'session temperary');
select * from admin_work_area;  -- there's data
select  * from permernate;  -- there's data
commit;  
select * from admin_work_area;  -- there's data
select  * from permernate;  -- there's data


 

会话2:

 

select * from admin_work_area;  -- there's NO data
select  * from permernate;  -- there's data

猜你喜欢

转载自kavinhub.iteye.com/blog/2005620