(轉) oracle 臨時表(事務級、會話級)

polestar123發表於2009-06-12
總結:
1、session級的臨時表,只有在truncate table、session結束才能釋放對錶的鎖定,等所有session釋放bounding臨時表,才能drop臨時表;否這會報ORA-14452: 試圖建立, 更改或刪除正在使用的臨時表中的索引。
2、臨時表需要drop才能去掉其定義
3、臨時表不產生redo、undo資訊
4、臨時表各個session間的資料是不可見的,只能看到自己session的資料
<wbr> <wbr> <wbr> 在Oracle8i或以上版本中,可以建立以下兩種臨時表:
<wbr> <wbr> <wbr> 1.會話特有的臨時表
<wbr> <wbr> <wbr> <wbr> CREATE GLOBAL TEMPORARY ()
<wbr> <wbr> <wbr> <wbr> ON COMMIT PRESERVE ROWS;
<wbr> <wbr>
<wbr> <wbr> <wbr> 2.事務特有的臨時表
<wbr> <wbr> <wbr> <wbr> CREATE GLOBAL TEMPORARY ()
<wbr> <wbr> <wbr> <wbr> ON COMMIT DELETE ROWS;
<wbr> <wbr> <wbr> <wbr> CREATE GLOBAL TEMPORARY TABLE MyTempTable
<wbr> <wbr> <wbr> 所建的臨時表雖然是存在的,但是你試一下insert 一條記錄然後用別的連線登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:
<wbr> <wbr> <wbr> --ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交後ORACLE將截斷表(刪除全部行)
<wbr> <wbr> <wbr> --ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。
<wbr> <wbr> <wbr> 衝突的問題更本不用考慮.
<wbr> <wbr>
<wbr> <wbr> <wbr> 臨時表只是儲存當前會話(session)用到的資料,資料只在事務或會話期間存在。
<wbr> <wbr>
<wbr> <wbr> <wbr> 透過CREATE GLOBAL TEMPORARY TABLE命令建立一個臨時表,對於事務型別的臨時表,
<wbr> <wbr> <wbr> 資料只是在事務期間存在,對於會話型別的臨時表,資料在會話期間存在。
<wbr> <wbr>
<wbr> <wbr> <wbr> 會話的資料對於當前會話私有。每個會話只能看到並修改自己的資料。DML鎖不會加到
臨時表的資料上。下面的語句控制行的存在性。
<wbr> <wbr>
<wbr> <wbr> <wbr> ● ON COMMIT DELETE ROWS 表名行只是在事務期間可見
<wbr> <wbr> <wbr> ● ON COMMIT PRESERVE ROWS 表名行在整個會話期間可見
<wbr> <wbr>
<wbr> <wbr> <wbr> 可以對臨時表建立索引,檢視,出發器,可以用export和import工具匯入匯出表的
定義,但是不能匯出資料。表的定義對所有的會話可見。
<wbr> <wbr> <wbr> Temporary Tables臨時表
<wbr> <wbr> <wbr> 1.簡介
<wbr> <wbr> <wbr> ORACLE資料庫除了可以儲存永久表外,還可以建立臨時表temporary tables。這些臨時表用來儲存一個會話SESSION的資料,
<wbr> <wbr> <wbr> 或者儲存在一個事務中需要的資料。當會話退出或者使用者提交commit和回滾rollback事務的時候,臨時表的資料自動清空,
<wbr> <wbr> <wbr> 但是臨時表的結構以及後設資料還儲存在使用者的資料字典中。
<wbr> <wbr> <wbr>臨時表只在oracle8i以及以上產品中支援。
<wbr> <wbr> <wbr> 2.詳細介紹
<wbr> <wbr> <wbr>Oracle臨時表分為會話級臨時表 和 事務級臨時表。
<wbr> <wbr> <wbr> 會話級臨時表是指臨時表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,Oracle自動清除臨時表中資料。
<wbr> <wbr> <wbr> 事務級臨時表是指臨時表中的資料只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中資料。
<wbr> <wbr> <wbr> 臨時表中的資料只對當前Session有效,每個Session都有自己的臨時資料,並且不能訪問其它Session的臨時表中的資料。因此,
<wbr> <wbr> <wbr> 臨時表不需要DML鎖.當一個會話結束(使用者正常退出 使用者不正常退出 ORACLE例項崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE 語句清空臨時表資料.但不會清空其它會話臨時表中的資料.
<wbr> <wbr> <wbr> 你可以索引臨時表和在臨時表基礎上建立檢視.同樣,建立在臨時表上的索引也是臨時的,也是隻對當前會話或者事務有效. <wbr> <wbr>
<wbr> <wbr> <wbr> 臨時表可以擁有觸發器.
<wbr> <wbr> <wbr> 3.建立臨時表
<wbr> <wbr> 臨時表的定義對所有會話SESSION都是可見的,但是表中的資料只對當前的會話或者事務有效.
<wbr> <wbr> 建立方法:
<wbr> <wbr> <wbr> 1) ON COMMIT DELETE ROWS 定義了建立事務級臨時表的方法.
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> CREATE GLOBAL TEMPORARY TABLE admin_work_area
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> (startdate DATE,
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> enddate DATE,
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> class CHAR(20))
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> ON COMMIT DELETE ROWS;
<wbr> <wbr> <wbr> <wbr> EXAMPLE:
<wbr> <wbr> <wbr> <wbr> SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
<wbr> <wbr> <wbr>2 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> (startdate DATE,
<wbr> <wbr> 3 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> enddate DATE,
<wbr> <wbr> <wbr> 4 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> class CHAR(20))
<wbr> <wbr> <wbr> 5 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> ON COMMIT DELETE ROWS;
<wbr> <wbr> <wbr> SQL> create table permernate( a number);
<wbr> <wbr> <wbr> SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');
<wbr> <wbr> <wbr> SQL> insert into permernate values(1);
<wbr> <wbr> <wbr> SQL> commit;
<wbr> <wbr> <wbr> SQL> select * from admin_work_area;
<wbr> <wbr> <wbr> SQL> select <wbr> <wbr> * from permernate;
<wbr> <wbr> <wbr> A
<wbr> <wbr> <wbr> 1
<wbr> <wbr> <wbr> 2)ON COMMIT PRESERVE ROWS 定義了建立會話級臨時表的方法.
<wbr> <wbr> <wbr> <wbr> <wbr> CREATE GLOBAL TEMPORARY TABLE admin_work_area
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> (startdate DATE,
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> enddate DATE,
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> class CHAR(20))
<wbr> <wbr> <wbr> <wbr> ON COMMIT PRESERVE ROWS;
<wbr> <wbr> <wbr> EXAMPLE:

<wbr> <wbr> <wbr> 會話1:
<wbr> <wbr> <wbr> SQL> drop table admin_work_area;
<wbr> <wbr> <wbr> SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
<wbr> <wbr> <wbr> 2 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> (startdate DATE,
<wbr> <wbr> 3 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> enddate DATE,
<wbr> <wbr> 4 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> class CHAR(20))
<wbr> <wbr> 5 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> ON COMMIT PRESERVE ROWS;
<wbr> <wbr> <wbr> SQL> insert into permernate values(2);
<wbr> <wbr> <wbr> SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');
<wbr> <wbr> <wbr> SQL> commit;
<wbr> <wbr> <wbr> SQL> select * from permernate;

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> A
<wbr> <wbr> <wbr> ----------
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> 1
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> 2

<wbr> <wbr> <wbr> SQL> select * from admin_work_area;

<wbr> <wbr> <wbr> STARTDATE <wbr> <wbr> ENDDATE <wbr> <wbr> <wbr> <wbr> CLASS
<wbr> <wbr> <wbr> ---------- ---------- --------------------
<wbr> <wbr> <wbr> 17-1?? -03 17-1?? -03 session temperary

<wbr> <wbr> <wbr> 會話2:

<wbr> <wbr> <wbr> SQL> select * from permernate;

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> A
<wbr> <wbr> <wbr> ----------
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> 1
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> 2

<wbr> <wbr> <wbr> SQL> select * from admin_work_area;

<wbr> <wbr> <wbr> 未選擇行.

<wbr> <wbr> <wbr> 會話2看不見會話1中臨時表的資料.

<wbr> <wbr> <wbr> 4 ORACLE臨時表和SQLSERVER臨時表異同

<wbr> <wbr> <wbr> SQL SERVER臨時表
<wbr> <wbr> <wbr> 也可以建立臨時表。臨時表與永久表相似,但臨時表儲存在 tempdb 中,當不再使用時會自動刪除。
<wbr> <wbr> <wbr> 有本地和全域性兩種型別的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字符號 (#) 打頭;
<wbr> <wbr> <wbr> 它們僅對當前的使用者連線是可見的;當使用者從 Microsoft? SQL Server? 2000 例項斷開連線時被刪除。全域性臨時表的名稱以數學符號
<wbr> <wbr> <wbr> (##) 打頭,建立後對任何使用者都是可見的,當所有引用該表的使用者從 SQL Server 斷開連線時被刪除。
<wbr> <wbr> <wbr> 例如,如果建立名為 employees 的表,則任何人只要在資料庫中有使用該表的安全許可權就可以使用該表,除非它已刪除。
<wbr> <wbr> <wbr> 如果建立名為 #employees 的本地臨時表,只有您能對該表執行操作且在斷開連線時該表刪除。如果建立名為 ##employees 的全域性臨時表,資料表中的任何使用者均可對該表執行操作。如果該表在您建立後沒有其他使用者使用,則當您斷開連線時該表刪除。如果該表在您建立後有其他使用者使用,則 SQL Server在所有使用者斷開連線後刪除該表
<wbr> <wbr> <wbr> 不同:
<wbr> <wbr> <wbr> <wbr>1.SQL SERVER臨時表是一種”記憶體表”,表是儲存在記憶體中的.ORACLE臨時表除非執行DROP TABLE,否則表定義會保留在資料字典中.
<wbr> <wbr> <wbr> 2.SQL SERVER臨時表不存在類似ORACLE臨時表 事務級別 上的功能.
<wbr> <wbr> <wbr> 3.SQL SERVER本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,ORACLE不會刪除表.
<wbr> <wbr> <wbr> 4.SQL SERVER的全域性臨時表(##) 是指多個連線共享同一片記憶體.當沒有指標引用該記憶體區域時,SQL SERVER自動釋放全域性臨時表.
<wbr> <wbr> <wbr> 5.由於ORACLE不是一種 記憶體中的資料庫. 所以如果ORACLE類似SQL SERVER 頻繁的對臨時表進行建立和刪除,必定會影響效能.
所以ORACLE會保留臨時表的定義直到使用者DROP TABLE.
<wbr> <wbr> <wbr> 6.在ORACLE中,如果需要多個使用者共享一個表(類似SQL SERVER的全域性臨時表##).則可以利用永久表,
並且在表中新增一些可以唯一標識使用者的列.利用觸發器和檢視.當使用者退出的時候,根據該登陸使用者的唯一資訊刪除相應的表中的資料.
<wbr> <wbr> <wbr> 這種方法給ORACLE帶來了一定量的負載.
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70612/viewspace-1023030/,如需轉載,請註明出處,否則將追究法律責任。

相關文章