臨時表是用於臨時存儲臨時數據(或中間數據)的數據庫對象。它有點類似於普通的桌子,但又有很大的不同。它只能存儲在臨時表空間中,而不是用戶的表空間中。ORACLE臨時表是會話級或事務級的,只對當前會話或事務可見。每個會話只能查看和修改自己的數據。
臨時表語法
clip_image002
臨時表分類
ORACLE臨時表有兩種類型:會話級臨時表和事務級臨時表。
1)
它是臨時表的默認參數,表示臨時表中的數據只在事務中有效。當事務被提交時,臨時表的臨時段將被自動截斷,但是臨時表的結構和元數據仍然存儲在用戶的數據字典中。如果臨時表完成了它的使命,最好刪除臨時表,否則數據庫會留下大量的表結構和臨時表的元數據。
2)提交時保留行
意思是臨時表的內容可以跨事物存在,但是當會話結束時,臨時表的臨時段會隨著會話的結束而被丟棄,臨時表中的數據自然也會被丟棄。但是,臨時表的結構和元數據也存儲在用戶的數據字典中。如果臨時表完成了它的使命,最好刪除臨時表,否則數據庫會留下大量的表結構和臨時表的元數據。
1:會話級臨時表中的數據與您當前的會話相關。如果當前會話不退出,臨時表中的數據將仍然存在,當您退出當前會話時,臨時表中的數據將被截斷表,如下所示:
會話級臨時表創建:
復制代碼
創建全局臨時表TMP_TEST
(
身份證號,
名稱VARCHAR2(32)
)在提交時保留行;
或者
在提交保留行時創建全局臨時表TMP_TEST
如同
SELECT * FROM TEST
操作示例:
SQL & gt創建全局臨時表TMP_TEST
(
身份證號,
名稱VARCHAR2(32)
)在提交時保留行;
表已創建
SQL & gt插入TMP_TEST
從DUAL中選擇1,' Kerry ';
1行已插入
SQL & gt提交;
提交完成
SQL & gtSELECT * FROM TMP _ TEST
ID名稱
- -
1凱瑞
SQL & gt插入TMP_TEST
從DUAL中選擇2個“rouce ”;
1行已插入
SQL & gt回滾;
回滾完成
SQL & gtSELECT * FROM TMP _ TEST
ID名稱
- -
1凱瑞
SQL & gt
復制代碼
2.事務級臨時表(默認)。這種類型的臨時表與事務相關。事務提交或回滾時,臨時表的數據會被自己截斷,即事務提交或回滾時,數據會被截斷,其他特性與會話級臨時表壹致。
事務級臨時表的創建方法:
復制代碼
創建全局臨時表TMP_TEST
(
身份證號,
名稱VARCHAR2(32)
)在提交時刪除行;
或者
在提交DELETE時創建全局臨時表TMP_TEST作為SELECT * FROM TEST
SQL & gt創建全局臨時表TMP_TEST
(
身份證號,
名稱VARCHAR2(32)
)在提交時刪除行;
表已創建
SQL & gt插入TMP_TEST
從DUAL中選擇1,' Kerry ';
1行已插入
SQL & gtSELECT * FROM TMP _ TEST
ID名稱
- -
1凱瑞
SQL & gt提交;
提交完成
SQL & gtSELECT * FROM TMP _ TEST
ID名稱
- -
SQL & gt
復制代碼
3:關於臨時表僅對當前會話或事務可見。每個會話只能查看和修改自己的數據。
用DM用戶登錄數據庫,打開SESSION 1,創建臨時表TMP_TEST。
復制代碼
創建全局臨時表TMP_TEST
(
身份證號,
名稱VARCHAR2(32)
)在提交時刪除行;
或者
在提交DELETE時創建全局臨時表TMP_TEST作為SELECT * FROM TEST
SQL & gt創建全局臨時表TMP_TEST
(
身份證號,
名稱VARCHAR2(32)
)在提交時刪除行;
表已創建
SQL & gt插入TMP_TEST
從DUAL中選擇1,' Kerry ';
1行已插入
SQL & gtSELECT * FROM TMP _ TEST
ID名稱
- -
1凱瑞
SQL & gt提交;
提交完成
SQL & gtSELECT * FROM TMP _ TEST
ID名稱
- -
SQL & gt
復制代碼
用sys用戶登錄數據庫,打開會話2。
Select * from DBA _ tables其中table _ name = ' tmp _ test '-可以找到臨時表數據。
SELECT * FROM DM。TMP _ TEST-找不到數據,即使TMP_TEST臨時表中有數據。
臨時表和永久表的區別
復制代碼
SQL & gtSELECT表名,表空間名,“日誌記錄”,
“臨時”、持續時間、“監控”
FROM DBA_TABLES,其中TABLE_NAME IN ('TMP_TEST ',' TEST ');
表名表空間名日誌記錄臨時持續時間監視
- - - - - -
測試TBS_EDS_DATA是N是
TMP _測試編號Y系統$會話編號
復制代碼
如上圖,臨時表存儲在臨時表空間中,但是從上面的腳本可以看出,臨時表並沒有在數據字典中指定它的表空間,臨時表為NOLOGGING,持續時間為SYS$SESSION。
臨時表的DML操作速度比較快,但是也會產生重做日誌,只是同樣的DML語句,比永久DML產生的少。實際上,在應用中,經常會創建壹個帶有NOLOGGING的永久表(中間表)來保存中間數據,從而取代臨時表。至於兩者的優劣,真的不好說清楚(歡迎討論)。
臨時表的使用
何時使用臨時表?使用臨時表和使用中間表有什麽區別?
我認為它在必要的時候被應用。以下是大衛·戴對臨時表的應用描述。我覺得很形象的說明了臨時表的應用場景:對於壹個電商網站來說,不同的消費者在網站上購物,這是壹個獨立的會話,把商品放進購物車,最後結算購物車裏的商品。換句話說,購物車中的信息必須在整個會話期間保存。與此同時,仍有壹些消費者往往在最終結賬時放棄購買商品。如果消費者購買信息直接存儲在最終表中(永久),必然會對最終表造成很大壓力。因此,對於這種情況,我們可以通過創建ON COMMIT PRESERVE行來解決。數據僅在進程期間有效。對於已經成功結算的有效數據,ORACLE會在臨時數據轉移到最終表後自動截斷。對於放棄結算的數據,ORACLE也自動截斷,不進行編碼控制,最終表只處理有效訂單,減輕了頻繁DML操作的壓力。
1:處理壹批臨時數據時,多個DML操作(插入、更新等。)都需要,建議使用臨時表。
2.當查詢中有壹些表需要多次用於連接時。(為了獲得目標數據,妳需要關聯A、B、C,同時,為了獲得另壹個目標數據,妳需要關聯D、B、C...)
關於臨時表和中間表(NOLOGGING)哪個更適合存儲中間數據,我個人更傾向於使用臨時表而不是中間表。
需要註意的事項
1)不支持lob對象,這可能是基於設計者對運行效率的考慮,但在實際應用中真正需要該功能時,不能使用臨時表。網上很多資料都是這麽說的。我沒有跟蹤哪個版本不支持lob對象。至少在ORACLE 10g中,臨時表支持lob對象。
SQL & gt創建全局臨時表TMP_TEST
2 (
3身份證號,
4名稱CLOB
5)在提交時保留行;
表已創建
SQL & gt
SQL & gt插入TMP_TEST
2從DUAL中選擇1,‘ADF’;
1行已插入
SQL & gtSELECT * FROM V $ VERSION
旗幟
-
Oracle數據庫10g企業版版本10.2.0.1.0 -產品
PL/SQL版本10.2.0.1.0 -生產
核心1.0生產
32位Windows的TNS:版本10.2.0.1.0 -生產
NLSRTL版本10.2.0.1.0 -生產
2)不支持主鍵和外鍵關系。
3)臨時表不能永久存儲數據。
4)臨時表的數據不會被備份和恢復,也不會有修改的日誌信息。
5)臨時表沒有DML鎖。
不會在臨時表的數據上獲取DML鎖。LOCK語句對臨時表沒有影響,因為每個會話都有自己的私有數據。
6)雖然臨時表上的DML操作速度比較快,也需要生成重做日誌,但是同樣的DML語句比永久DML生成的少。請看官方文件:
臨時表上的DML語句不會為數據更改生成重做日誌。但是,會生成數據的撤消日誌和撤消日誌的重做日誌。在會話終止的情況下,當用戶註銷或會話異常終止(如會話或實例失敗)時,會自動刪除臨時表中的數據。
7)臨時表可以創建臨時索引、視圖和觸發器。
8)如果您想要刪除會話級臨時表並且它包含數據,您必須首先截斷其中的數據。否則,您將報告壹個錯誤。
SQL & gt刪除表TMP _ TEST PURGE
刪除表TMP _測試清除
ORA-14452:試圖在使用中的臨時表中創建、更改或刪除索引。
SQL & gt截斷表TMP _ TEST
表格被截斷
SQL & gt刪除表TMP _ TEST PURGE
表格已刪除