网友问到了临死表,这里特地的写一写临时表的总结blob文

创建Oracle临时表,根据生命期,可以分为有两种类型的临时表 

会话级的临时表 

事务级的临时表。 

故名思意 

会话级的临时表生命期是session,当你当前session不退出的情况下,临时表的数据就还存在,而当退出当前session的时候,这个session里的临时表中的数据就消亡了,是session级别的,所以其他的session是看不到这个表里其他session的数据的。 

事务级的临时表。类同,不过是transaction级别的。 当你的transactoin没有消亡时,也就是没有rollback或者是commit的时候,临时表的transcation里的数据仍然存在,只有当你的事务消亡,你的刚才transaction的数据就会消亡,不管是rollback还是commit。不同的transcaton是看不到这个表以及数据的。

 

有关会话级临时表的例子

 

Create Global Temporary Table tableanme (col1 type1, col2, type2) On Commit Preserve Rows

 

测试

SQL>Create Global Temporary Table temp_table1 (id int, name varchar(100)) On Commit Preserve Rows;

 

session 1:

SQL> insert into temp_table1 values(1, 'session1');

1 row created.

SQL> commit;

 

 

SQL> select count(*), userenv('sessionid') sessionid from temp_table1;

 

  COUNT(*)  SESSIONID

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

         1       3583

 

 

 

session2

 

 

SQL> select count(*), userenv('sessionid') sessionid from temp_table1;

 

  COUNT(*)  SESSIONID

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

         0       3582

 

 

可以看到这里session2是看不到session1里的数据,同样session2.增加一条数据,session1也是看不到的。

 

 

 

下面我们来看看

事务级的临时表的例子

Create Global Temporary Table tableanme (col1 type1, col2, type2) On Commit Delete Rows;

其实这里对照的话,可以发现这里也就是一个是commit以后还preserve,而transaction的基于transaction的,所以commit的时候需要delete数据。

 

实例

SQL>Create Global Temporary Table temp_table1 (id int, name varchar(100)) On Commit delete Rows;

 

SQL> insert into temp_table2 values(1, 'session1');

1 row created.

SQL> insert into temp_table2 values(2, 'session1');

1 row created.

现在没有commit

 

SQL> select count(*), userenv('sessionid') sessionid from temp_table2;

  COUNT(*)  SESSIONID

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

         2       3583

 

 

commit以后

SQL> commit;

 

SQL> select count(*), userenv('sessionid') sessionid from temp_table2;

 

  COUNT(*)  SESSIONID

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

         0       3583

 

 

commit以后临时表的数据,即使是commit了,但是也消失了。

 

 

session2

不管什么时候都看不到这个数据

 

SQL> select count(*), userenv('sessionid') sessionid from temp_table2;

 

  COUNT(*)  SESSIONID

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

         0       3582

 

 

临时表不占用用户表空间,是建立在temporary tablespace上的,对于没有生命期里的临时表,oracle是单独的为每个生命周期的临时表建立一个Segment,这样每个也就隔离开了。临时表和一个正常表一样的可以建立index,view,trigger等,

比如

 

SQL> create index IDX_temp_table2 on temp_table2(id);

Index created.

 

 

 

SQL> create or replace trigger TEMP_TABLE2_TRI AFTER DELETE OR INSERT OR UPDATE ON temp_table2

  2  DECLARE

  3  v_char varchar(100);

  4  begin

  5  dbms_output.put_line(1);

  6  end;

  7  /

 

Trigger created.

 

SQL> set serverout on;

SQL> insert into temp_table2 values(2, 'session1');

1

1 row created.