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

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

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