臨時表temporary table
===========================================================
作者: xsb(http://xsb.itpub.net)
發表于:2005.08.19 09:22
分類:
Oracle
出處:http://xsb.itpub.net/post/419/38485
---------------------------------------------------------------
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;
建議:
不得已的情況下(比較複雜的資料處理)才使用臨時表,否則盡可能使用子查詢代替或使用遊标。