一、简介
Oracle 数据库除了可以保存永久表外,还可以建立临时表(temporary tables)。这些临时表用来保存一个会话(SESSION)的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交(commit)和回滚(rollback)事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。
Oracle 临时表分为“会话级临时表”和“事务级临时表”。
“会话级临时表”是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
“事务级临时表”是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。
当一个会话结束(用户正常退出、用户不正常退出 Oracle 、实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据。但不会清空其它会话临时表中的数据。
你可以在临时表上建立索引和在临时表基础上建立视图。同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效。临时表可以拥有触发器。
临时表的定义对所有会话(SESSION)都是可见的,但是表中的数据只对当前的会话或者事务有效。
二、建立方法
1. ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法。
SQL> CREATE GLOBAL TEMPORARY TABLE test_tab (
2 id VARCHAR2(10) NOT NULL,
3 name VARCHAR2(20),
4 test_date DATE
5 ) ON COMMIT DELETE ROWS;
Table created.
SQL> desc test_tab
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL VARCHAR2(10 CHAR)
NAME VARCHAR2(20 CHAR)
TEST_DATE DATE
SQL> insert into test_tab values ('001', 'Fred', sysdate);
1 row created.
SQL> select * from test_tab;
ID NAME TEST_DATE
-------------------- ---------------------------------------- ----------
001 Fred 04-5月 -07
SQL> commit;
Commit complete.
SQL> select * from test_tab;
no rows selected
SQL>
2. ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法.
会话1:
SQL> drop table test_tab;
Table dropped.
SQL> CREATE GLOBAL TEMPORARY TABLE test_tab (
2 id VARCHAR2(10) NOT NULL,
3 name VARCHAR2(20),
4 test_date DATE
5 ) ON COMMIT DELETE ROWS;
Table created.
SQL> insert into test_tab values ('001', 'Fred', sysdate);
1 row created.
SQL> select * from test_tab;
ID NAME TEST_DATE
-------------------- ---------------------------------------- ----------
001 Fred 04-5月 -07
SQL>
会话2:
SQL> select * from test_tab;
no rows selected
SQL>
会话2看不见会话1中临时表的数据。