關於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
- [20201207]關於ORACLE IMU的一些疑問.txtOracle
- 關於with 臨時表 as的一些用法
- Sqlserver 關於臨時表和表變數的總結SQLServer變數
- mysql關於臨時表的總結MySql
- oracle11g 查詢臨時表空間的使用率和正在使用臨時表空間的使用者Oracle
- oracle臨時表空間相關Oracle
- 關於使用plsql操作oracle的一點小技巧和幾個常用的查詢語句SQLOracle
- Oracle 查詢佔用臨時表空間大的歷史會話和SQLOracle會話SQL
- 關於使用plsql操作oracle的一點小技巧和幾個常用的查詢語句BUSQLOracle
- Oracle臨時表使用注意事項Oracle
- 關於 dingo API 的疑問GoAPI
- MySQL關於資料字典的一個疑問MySql
- SQLServer臨時表的使用SQLServer
- [20190312]關於增量檢查點的疑問(補充).txt
- Oracle臨時表的用法總結FLOracle
- 關於String內的indexOf方法的一些疑問Index
- ORACLE臨時表總結Oracle
- 關於使用iview中Table元件的一點小技巧View元件
- Python關於使用subprocess.Popen時遇到的一個小問題記錄Python
- Mybatis【2.2】-- Mybatis關於建立SqlSession原始碼分析的幾點疑問?MyBatisSQLSession原始碼
- 關於技能技術企劃書的疑問和建議
- Oracle 臨時表 OracleDataAdapter 批次更新OracleAPT
- oracle 臨時表空間的增刪改查Oracle
- Composer 建立專案時報錯的一點經歷
- 關於問問題和時間管理的感悟
- 關於 /dev/null 差點直播吃鞋的一個小問題devNull
- 關於移動端 App 測試的疑問APP
- 【Django】有關多使用者管理的一點小經驗分享Django
- 關於v-for的一點小總結
- locust 使用的疑問
- 長安十二時辰 一部懸疑小說 不是歷史小說
- pl/sql developer中關於TIMESTAMP顯示格式的疑問和學習SQLDeveloper
- 12C關於CDB、PDB 臨時temp表空間的總結
- 關於Flutter空安全的一些使用經驗和理解Flutter
- 一個程式設計師經歷的7小時全身麻醉程式設計師
- 關於Oracle的BLOB和CLOBOracle
- 檢視oracle臨時表空間佔用率的檢視Oracle
- Python中關於Thread的一點小知識Pythonthread