ORACLE 数据库除了可以保存永久表外,还可以建立临时表 temporary tables。这些临时表用来保存一个会话 SESSION 的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交 commit 和回滚 rollback 事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。Oracle 临时表分为会话级临时表和事务级临时表,如下:
1.1. 事务级临时表
? 语法:
CREATE GLOBAL TEMPORARY
TABLE table_name
(a number(10), b number(10), ……) on commit delete rows;
? 测试: commit;事务结束后,临时表中的数据自动清空
--创建事务级临时表
SQL> create global temporary table t1(x int) on commit
2 delete rows;
Table created.
--插入测试数据
SQL> insert into t1 select rownum from dual connect by
2 rownum <=10;
10 rows created.
--验证,临时表中确实已经存在相应数据
SQL> select count(*) from t1;
COUNT(*)
----------
10
--提交,结束当前事务,也就是说,事务级的临时表已经被清空了
SQL> commit;
Commit complete.
--验证临时表,确实已经清空
SQL> select count(*) from t1;
COUNT(*)
----------
0
1.2. 会话级临时表
? 语法:
CREATE GLOBAL
TEMPORARY TABLE table_name
(a number(10), b number(10), ……) on commit PRESERVE rows;
? 测试:commit ;会话结束后,临时表中的数据自动清空(事务结束后,数据任然存在)
--创建会话级临时表
SQL> create global temporary table t2(x int) on commit preserve rows;
Table created.
--插入测试数据
SQL> insert into t2 select rownum from dual connect by
2 rownum <= 10;
10 rows created.
SQL> select count(*) from t2;
COUNT(*)
----------
10
--提交,结束事务
SQL> commit;
Commit complete.
--再次查询,数据依旧在,因为 t2 表是会话级的临时表
SQL> select count(*) from t2;
COUNT(*)
----------
10
--退出会话,再次验证数据,表中已经清空
SQL> conn / as sysdba
Connected.
——再进入scott用户下验证:
SQL> conn scott/tiger
Connected.
SQL>
SQL> select count(*) from t2;
COUNT(*)
----------
0
注:临时表是可以共享的,多个会话可以同时使用一个临时表,互不相干