在Oracle8i或以上版本中,可以建立以下兩種暫存資料表:
1。會話特有的暫存資料表
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT PRESERVE ROWS;
2。事務特有的暫存資料表
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的暫存資料表雖然是存在的,但是你試一下insert 一條記錄然後用別的串連登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:
--ON COMMIT DELETE ROWS 說明暫存資料表是事務指定,每次提交後ORACLE將截斷表(刪除全部行)
--ON COMMIT PRESERVE ROWS 說明暫存資料表是會話指定,當中斷會話時ORACLE將截斷表。
衝突的問題更本不用考慮.
暫存資料表只是儲存當前會話(session)用到的資料,資料只在事務或會話期間存在。
通過CREATE GLOBAL TEMPORARY TABLE命令建立一個暫存資料表,對於事務類型的暫存資料表, 資料只是在事務期間存在,對於會話類型的暫存資料表,資料在會話期間存在。
會話的資料對於當前會話私人。每個會話只能看到並修改自己的資料。DML鎖不會加到 暫存資料表的資料上。下面的語句控制行的存在性。
● ON COMMIT DELETE ROWS 表名行只是在事務期間可見
● ON COMMIT PRESERVE ROWS 表名行在整個會話期間可見
可以對暫存資料表建立索引,視圖,出發器,可以用export和import工具匯入匯出表的 定義,但是不能匯出資料。表的定義對所有的會話可見。
Temporary Tables暫存資料表
1簡介
ORACLE資料庫除了可以儲存永久表外,還可以建立暫存資料表temporary tables。這些暫存資料表用來儲存一個會話SESSION的資料,
或者儲存在一個事務中需要的資料。當會話退出或者使用者提交commit和復原rollback事務的時候,暫存資料表的資料自動清空,
但是暫存資料表的結構以及中繼資料還儲存在使用者的資料字典中。
暫存資料表只在oracle8i以及以上產品中支援。
2詳細介紹
Oracle暫存資料表分為 會話級暫存資料表 和 事務級暫存資料表。
會話級暫存資料表是指暫存資料表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,Oracle自動清除暫存資料表中資料。
事務級暫存資料表是指暫存資料表中的資料只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除暫存資料表中資料。
暫存資料表中的資料只對當前Session有效,每個Session都有自己的臨時資料,並且不能訪問其它Session的暫存資料表中的資料。因此,
暫存資料表不需要DML鎖.當一個會話結束(使用者正常退出 使用者不正常退出 ORACLE執行個體崩潰)或者一個事務結束的時候,Oracle對這個會話的
表執行 TRUNCATE 語句清空暫存資料表資料.但不會清空其它會話暫存資料表中的資料.
你可以索引暫存資料表和在暫存資料表基礎上建立視圖.同樣,建立在暫存資料表上的索引也是臨時的,也是只對當前會話或者事務有效.
暫存資料表可以擁有觸發器.
3建立暫存資料表
暫存資料表的定義對所有會話SESSION都是可見的,但是表中的資料只對當前的會話或者事務有效.
建立方法:
1) ON COMMIT DELETE ROWS 定義了建立事務級暫存資料表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS;
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS; SQL> create table permernate( a number); SQL> insert into admin_work_area values(sysdate,sysdate, ‘temperary table ‘); SQL> insert into permernate values(1); SQL> commit; SQL> select * from admin_work_area; SQL> select * from permernate; A 1
2)ON COMMIT PRESERVE ROWS 定義了建立會話級暫存資料表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT PRESERVE ROWS; EXAMPLE:
會話1:
SQL> drop table admin_work_area; SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 2 (startdate DATE, 3 enddate DATE, 4 class CHAR(20)) 5 ON COMMIT PRESERVE ROWS; SQL> insert into permernate values(2); SQL> insert into admin_work_area values(sysdate,sysdate, ‘session temperary ‘); SQL> commit; SQL> select * from permernate;A ---------- 1 2SQL> select * from admin_work_area;STARTDATE ENDDATE CLASS ---------- ---------- -------------------- 17-1?? -03 17-1?? -03 session temperary
會話2:
SQL> select * from permernate;A ---------- 1 2SQL> select * from admin_work_area;
未選擇行.
會話2看不見會話1中暫存資料表的資料.
4 ORACLE暫存資料表和SQLSERVER暫存資料表異同
SQL SERVER暫存資料表
也可以建立暫存資料表。暫存資料表與永久表相似,但暫存資料表儲存在 tempdb 中,當不再使用時會自動刪除。
有本地和全域兩種類型的暫存資料表,二者在名稱、可見度和可用性上均不相同。本地暫存資料表的名稱以單個數字記號 (#) 打頭;
它們僅對當前的使用者串連是可見的;當使用者從 Microsoft? SQL Server? 2000 執行個體中斷連線時被刪除。全域暫存資料表的名稱以數學符號
(##) 打頭,建立後對任何使用者都是可見的,當所有引用該表的使用者從 SQL Server 中斷連線時被刪除。
例如,如果建立名為 employees 的表,則任何人只要在資料庫中有使用該表的安全許可權就可以使用該表,除非它已刪除。
如果建立名為 #employees 的本地暫存資料表,只有您能對該表執行操作且在中斷連線時該表刪除。如果建立名為 ##employees 的全域暫存資料表
資料表中的任何使用者均可對該表執行操作。如果該表在您建立後沒有其他使用者使用,則當您中斷連線時該表刪除。如果該表在您建立
後有其他使用者使用,則 SQL Server在所有使用者中斷連線後刪除該表
不同:
1. SQL SERVER暫存資料表是一種”記憶體表”,表是儲存在記憶體中的.ORACLE暫存資料表除非執行DROP TABLE,否則表定義會保留在資料字典中.
2. SQL SERVER暫存資料表不存在類似ORACLE暫存資料表 事務層級 上的功能.
3 SQL SERVER本地暫存資料表(#) 與 ORACLE的會話層級暫存資料表類似,但是在會話退出的時候,ORACLE不會刪除表.
4 SQL SERVER的全域暫存資料表(##) 是指多個串連共用同一片記憶體.當沒有指標引用該記憶體地區時,SQL SERVER自動釋放全域暫存資料表.
5 由於ORACLE不是一種 記憶體中的資料庫. 所以如果ORACLE類似SQL SERVER 頻繁的對暫存資料表進行建立和刪除,必定會影響效能.
所以ORACLE會保留暫存資料表的定義直到使用者DROP TABLE.
6 在ORACLE中,如果需要多個使用者共用一個表(類似SQL SERVER的全域暫存資料表##).則可以利用永久表,
並且在表中添加一些可以唯一標識使用者的列.利用觸發器和視圖.當使用者退出的時候,根據該登陸使用者的唯一資訊刪除相應的表中的資料.
這種方法給ORACLE帶來了一定量的負載.
以上就是對oracle 暫存資料表 的資料整理,後續繼續補充相關資料,謝謝大家對本站的支援!