暫存資料表的概念
在Oracle資料庫中還有一種類型的表,叫做暫存資料表。這個暫存資料表跟永久表最大的區別就是表中的資料不會永遠的存在。當一個會話結束或者事務結束的時候,這個暫存資料表中的資料,不用使用者自己刪除,資料庫自己會自動清除。(表是全域,只是資料消失)
會話級暫存資料表是指暫存資料表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,Oracle自動清除暫存資料表中資料。南京Oracle認證培訓
事務級暫存資料表是指暫存資料表中的資料只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除暫存資料表中資料。暫存資料表中的資料只對當前Session有效,每個Session都有自己的臨時資料,並且不能訪問其它Session的暫存資料表中的資料。因此,暫存資料表不需要DML鎖.當一個會話結束(使用者正常退出使用者不正常退出 ORACLE執行個體崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE 語句清空暫存資料表資料.但不會清空其它會話暫存資料表中的資料。
你可以索引暫存資料表和在暫存資料表基礎上建立視圖.同樣,建立在暫存資料表上的索引也是臨時的,也是只對當前會話或者事務有效.暫存資料表可以擁有觸發器.
1.會話特有的暫存資料表
| 代碼如下 |
複製代碼 |
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT PRESERVE ROWS;
|
2.事務特有的暫存資料表
| 代碼如下 |
複製代碼 |
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT DELETE ROWS;
|
3.SESSION級暫存資料表
| 代碼如下 |
複製代碼 |
1、建立暫存資料表
create global temporary table temp_tbl(col_a varchar2(30)) on commit preserve rows 2、插入資料 insert into temp_tbl values('test session table') 3、提交commit; 4、查詢資料 select *from temp_tbl |
可以看到資料'test session table'記錄還在。
結束SESSION,重新登入,再查詢資料select *from temp_tbl,這時候記錄已不存在,因為系統在結束SESSION時自動清除記錄
3、TRANSACTION級暫存資料表
| 代碼如下 |
複製代碼 |
1、建立暫存資料表 create global temporary table temp_tbl(col_a varchar2(30)) on commit delete rows 2、插入資料 insert into temp_tbl values('test transaction table') 3、提交 commit 4、查詢資料 select *from temp_tbl |
這時候可以看到剛才插入的記錄'test transaction table'已不存在了;同樣,如果不提交而直接結束SESSION,重新登入記錄也不存在
4.用預存程序建立:
| 代碼如下 |
複製代碼 |
create procduce test is isql varchar2(200); dptable varchar2(100):='drop table test'; begin isql:='create global temporary table test (sid int,sname varchar2(20)) on commit delete rows; execute immediate isql; --建立暫存資料表 insert into test values (1,'abc'); execute immediate dptable; ---刪除暫存資料表 end; |
對於oracle 暫存資料表在預存程序中調用,我是覺得這視乎沒什麼意義,oracle 提供在資料庫裡預定義暫存資料表,只有在調用的時候才會在暫存資料表空間裡分配空間,也就是說你可以提前在資料庫裡建立暫存資料表,然後再到預存程序裡直接調用暫存資料表就行了
5.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帶來了一定量的負載.