臨時表temporary table
===========================================================
a
8i以上版本。
Oracle 的臨時表與MSSQL的不同,臨時表需要先創建,不建議在運行時使用DDL語句創建!
臨時表可以看作是一張普通的物理表,在其上可以建索引、建視圖,建觸發器等!但它的數據是會話隔離的。
區別之處:
l 向表中插入數據只在會話或事務期間存在
l 表中的數據只對插入數據的會話是可見的
l 可用ON COMMIT指導定數據是會話專用還是事務專用
臨時表的限定:
l 臨時表不能被分區
l 不能指定約束
l 不包括含嵌套表的列或VARRAY類型
l 不能指定TABLESPACE, STORAGE_CLAUSE, LONGGING, NOLOGGING, MONITORING, LOB_INDEX_CLAUSE等
l 不能指定SEGMENT_ATTRIBUTES_CLAUSE,NESTED_TABLE_COL_PROPERTIES或PARALLEL_CLAUSE
l 分布事務不支持臨時表

臨時表的創建:
create global temporary tablename(column list) 
on commit preserve rows; --提交保留數據 會話臨時表 
on commit delete rows; --提交刪除數據 事務臨時表 
臨時表是相對于會話的,別的會話看不到該會話的數據。
oracle的臨時表和sql server不一樣,在使用完成以后,oracle臨時表中的紀錄可以被定義為自動刪除(分session方式和transaction方式),而表結構不會被自動刪除;sql server中的臨時表在使用后會被完全刪除。
所以,如果是常用的臨時表,你不妨一開始就建好表。
在使用的時候,不同對話之間的紀錄互相不干擾,所以不會給使用帶來任何問題。

對偶爾使用的臨時表,也可以在過程中用動態SQL來建立(但不建議,DDL語句有較大的開銷!):
CREATE OR REPLACE PROCEDURE myProc(...) AUTHID current_user IS
...
BEGIN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY ....';
...
END;
建議:
不得已的情況下(比較復雜的數據處理)才使用臨時表,否則盡可能使用子查詢代替或使用游標。