關於Oracle臨時表的使用的小經歷和一點疑問?
關於Oracle臨時表的使用的小經歷
前幾天給同事一個建議—使用臨時表完成某些複雜邏輯的處理和輸出,今天突然告訴我說臨時表在儲存過程中用不了,所以回去特意除錯了一下,沒問題。
讓我們先看看Oracle官方文件中的說明吧
(
testID number
)ON COMMIT DELETE ROWS;
CREATE OR REPLACE PROCEDURE p_TempTable_DeleteRows
(
oCursor OUT RefType.RefCursor
)
IS
BEGIN
INSERT INTO T_TempTable_DeleteRows
(
testID
)
SELECT 1 FROM DUAL;
--COMMIT;
OPEN OCURSOR FOR SELECT * FROM T_TempTable_DeleteRows;
END;
/
測試儲存過程後,可以看到遊標正常返回結果集
檢查該臨時表,發現該表並無資料,當該儲存過程的事務結束後,臨時表資料已經被清除
儲存過程中不能有COMMIT,否則遊標會無結果,顯式提交表示事務結束,所以沒有資料,倒也比較合情合理
SELECT * FROM T_TempTable_DeleteRows;
CREATE GLOBAL TEMPORARY TABLE T_TempTable_PreserveRows
(
testID number
)ON COMMIT PRESERVE ROWS;
CREATE OR REPLACE PROCEDURE p_TempTable_PreserveRows
(
oCursor OUT RefType.RefCursor
)
IS
BEGIN
INSERT INTO T_TempTable_PreserveRows
(
testID
)
SELECT 1 FROM DUAL;
COMMIT;
OPEN OCURSOR FOR SELECT * FROM T_TempTable_PreserveRows;
END;
/
測試儲存過程後,可以看到遊標正常返回結果集,如果連續透過PL/SQL developer的test window執行多次,則發現在返回遊標的結果集中出現多次記錄
但是如果另開一個test視窗去測試,仍舊只返回一條記錄
如果檢查該臨時表,發現該表並無資料
不清楚這個會話到底是指什麼會話,本來以為執行後會出現多條記錄,並且一直存在於當前會話的臨時記錄中
SELECT * FROM T_TempTable_PreserveRows;
前幾天給同事一個建議—使用臨時表完成某些複雜邏輯的處理和輸出,今天突然告訴我說臨時表在儲存過程中用不了,所以回去特意除錯了一下,沒問題。
讓我們先看看Oracle官方文件中的說明吧
ON COMMIT
只有當建立臨時表的時候ON COMMIT語法才會被用到,這個語法指明瞭臨時表資料以會話還是以事務的生命週期進行儲存。
DELETE ROWS
Delete Rows選項表示在事務級別刪除資料的臨時表(預設值),每次事務結束後Oracle都會刪除所有記錄。
PRESERVE ROWS
Preserve Rows選項表示在會話級刪除資料的臨時表,當結束本次會話時Oracle才會刪除所有記錄。
CREATE GLOBAL TEMPORARY TABLE T_TempTable_DeleteRows(
testID number
)ON COMMIT DELETE ROWS;
CREATE OR REPLACE PROCEDURE p_TempTable_DeleteRows
(
oCursor OUT RefType.RefCursor
)
IS
BEGIN
INSERT INTO T_TempTable_DeleteRows
(
testID
)
SELECT 1 FROM DUAL;
--COMMIT;
OPEN OCURSOR FOR SELECT * FROM T_TempTable_DeleteRows;
END;
/
測試儲存過程後,可以看到遊標正常返回結果集
檢查該臨時表,發現該表並無資料,當該儲存過程的事務結束後,臨時表資料已經被清除
儲存過程中不能有COMMIT,否則遊標會無結果,顯式提交表示事務結束,所以沒有資料,倒也比較合情合理
SELECT * FROM T_TempTable_DeleteRows;
CREATE GLOBAL TEMPORARY TABLE T_TempTable_PreserveRows
(
testID number
)ON COMMIT PRESERVE ROWS;
CREATE OR REPLACE PROCEDURE p_TempTable_PreserveRows
(
oCursor OUT RefType.RefCursor
)
IS
BEGIN
INSERT INTO T_TempTable_PreserveRows
(
testID
)
SELECT 1 FROM DUAL;
COMMIT;
OPEN OCURSOR FOR SELECT * FROM T_TempTable_PreserveRows;
END;
/
測試儲存過程後,可以看到遊標正常返回結果集,如果連續透過PL/SQL developer的test window執行多次,則發現在返回遊標的結果集中出現多次記錄
但是如果另開一個test視窗去測試,仍舊只返回一條記錄
如果檢查該臨時表,發現該表並無資料
不清楚這個會話到底是指什麼會話,本來以為執行後會出現多條記錄,並且一直存在於當前會話的臨時記錄中
SELECT * FROM T_TempTable_PreserveRows;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-134192/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Oracle臨時表的使用的小經歷Oracle
- 關於oracle with table as 建立臨時表的用法示例以及使用with as 的優點Oracle
- 關於jdonframework框架的小疑問Framework框架
- oracle 臨時表的使用Oracle
- 關於with 臨時表 as的一些用法
- Sqlserver 關於臨時表和表變數的總結SQLServer變數
- 27、oracle的臨時表問題Oracle
- asynchttpclient 使用的一點疑問HTTPclient
- 有關事件的一點疑問事件
- 關於 oracle 臨時表 ORA-14452Oracle
- mysql關於臨時表的總結MySql
- 關於例項變數和靜態變數的一點疑問變數
- ORACLE臨時表和SQLSERVER臨時表異同OracleSQLServer
- Oracle的臨時表Oracle
- 關於字典和陣列的疑問陣列
- 【基礎知識】基於事物的臨時表和基於會話的臨時表會話
- 敲程式碼時的一個小疑問
- oracle臨時表的經典學習資料Oracle
- Oracle事務臨時表的一個隱藏問題Oracle
- 有幾點關於C語言的疑問C語言
- 關於移動臨時表空間檔案位置的問題
- 關於原型模式的看法和疑問原型模式
- oracle臨時表的用法Oracle
- oracle11g 查詢臨時表空間的使用率和正在使用臨時表空間的使用者Oracle
- 【臨時表空間】11g中使用 SHRINK方法縮小臨時表空間和臨時檔案
- 關於windows installer的一點小經驗(轉)Windows
- 關於TargetServiceFactoryVisitable的疑問
- oracle臨時表空間相關Oracle
- 建立基於事務和基於會話的臨時表及臨時表建索引的實驗會話索引
- 【臨時表空間】11g中使用 SHRINK方法縮小臨時表空間和臨時檔案(續)
- SQLServer臨時表的使用SQLServer
- 關於Proxy和Decorator設計模式的疑問設計模式
- Oracle 基礎 ----臨時表和物件表Oracle物件
- mysql臨時表的問題MySql
- oracle的臨時表空間Oracle
- oracle臨時表的用法(轉)Oracle
- Oracle 查詢佔用臨時表空間大的歷史會話和SQLOracle會話SQL
- 關於PHP 的一點點小分享PHP