天天看點

java temporary_臨時表temporary table

臨時表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;

建議:

不得已的情況下(比較複雜的資料處理)才使用臨時表,否則盡可能使用子查詢代替或使用遊标。