网友问到了临死表,这里特地的写一写临时表的总结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.