示例一html
-- Create table 三目錄監控存儲過程臨時表 create global temporary table L_DIAITEM_ERROR ( forgid NUMBER, --組織機構id forgname VARCHAR2(80), --組織機構名稱 nccw NUMBER, --名稱錯誤數 wdz NUMBER --未對照計數 ) on commit delete rows; --事務提交時,清空表數據 --插入一條數據 INSERT INTO L_DIAITEM_ERROR (nccw,wdz) SELECT 1,2 FROM DUAL; --查詢該表數據 SELECT * FROM L_DIAITEM_ERROR
示例二java
第一步:建立臨時表sql
/** * 建立臨時指標表 */ CREATE GLOBAL TEMPORARY TABLE TAB_INDEX_TEMP(A_ID NUMBER,--一級指標ID A_INDEXNAME VARCHAR2(50), --一級指標名稱 TOTALWEIGHT NUMBER, --權重佔比 B_ID NUMBER, --二級指標ID B_INDEXNAME VARCHAR2(200), ----二級指標名稱 INDEXSCORE NUMBER, --指標分值 COUNTER VARCHAR2(200), --計算方法 REMARK VARCHAR2(200)) ON COMMIT DELETE ROWS;/*事務提交時,清空臨時表數據*/
第二步:將數據插入臨時表數據庫
/*將數據批量插入臨時表*/ INSERT INTO TAB_INDEX_TEMP SELECT A.ID A_ID, A.INDEXNAME A_INDEXNAME, A.TOTALWEIGHT, B.ID B_ID, B.INDEXNAME B_INDEXNAME, B.INDEXSCORE, B.COUNTER, B.REMARK FROM INDEX_B B, INDEX_A A WHERE A.STATUS = 1 AND B.STATUS = 1 AND B.INDEXTYPE = 2 --二級指標 AND B.INDEXA_ID = A.ID ORDER BY B_ID;
第三步:查詢臨時表併發
說明:oracle
執行插入語句後,若是沒有提交,執行查詢語句,該表有數據;工具
若是提交事務,執行查詢語句,清空數據;測試
臨時表通常和存儲過程一塊兒使用。spa
詳細介紹插件
參考連接:http://www.cnblogs.com/vigarbuaa/archive/2012/06/04/2534797.html
在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
區別:
ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交後ORACLE將截斷表(刪除所有行,清空表數據)
ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,每次中斷會話ORACLE將截斷表(清空表數據)
做用域:
經過CREATE GLOBAL TEMPORARY TABLE命令建立一個臨時表,
對於事務類型的臨時表,數據只是在本事務期間存在;對於會話類型的臨時表,數據在本會話期間存在。
臨時表的特色:
能夠對臨時表建立索引,視圖,觸發器,能夠用export和import工具導入導出表的定義,可是不能導出數據。表的定義對全部的會話可見。
(1) 多用戶操做的獨立性:對於使用同一張臨時表的不一樣用戶,ORACLE都會分配一個獨立的 Temp Segment,這樣就避免了多個用戶在對同一張臨時表操做時發生交叉,從而保證了多個用戶操做的併發性和獨立性;
(2) 數據的臨時性:既然是臨時表,顧名思義,存放在該表中的數據是臨時性的。ORACLE根據你建立臨時表時指定的參數(On Commit Delete Rows / On Commit Preserve Rows),自動將數據TRUNCATE掉。
2020/04/18
應用場景:在oracle存儲過程當中,使用臨時表返回數據遊標。
會話指定:PRESERVE
在plsql中測試結果以下:
1.若是是會話指定:PRESERVE,存儲過程測試窗口運行一次後,未關閉該窗口的狀況下,沒法刪除該臨時表;(即便該提交的事務已經提交)
以存儲過程當中往臨時表中插入數據爲例,當存儲過程裏沒有自動提交,且測試窗口也沒有手動提交時
2.點擊紅框左側按鈕執行幾回,數據就會插入幾回,即便沒有提交,只有關閉窗口時,該臨時表所對應的會話數據纔會消失。
在javaWeb項目中調用該存儲過程,以上兩點也一樣適用,只有關閉程序,會話纔算結束,臨時表數據纔會被清空。
所以,在程序調用存儲過程時,不能使用會話指定:PRESERVE,數據庫會斷定程序始終是同一會話,這樣的話,數據只會越查越多,根本不是咱們想要的結果。
若是非得使用這種指定方式的話,須要在存儲過程調用該臨時表前清空該臨時表。
另外,不一樣會話以前的臨時表數據不是互通的,好比上圖所示,A會話裏臨時表已經有不少數據,當你再打開一個測試窗口進行查詢時數據就不會有這麼多了。
事物指定:DELETE
在plsql中測試結果以下:
1.在事務提交以前,沒法刪除該臨時表;但事務提交後,就能夠刪除啦。
2.當存儲過程沒有自動提交,須要手動提交時,在測試窗口查詢多少次,就會插入多少次,只有在提交事務後,該會話中臨時表的數據纔會消失。
在javaWeb項目中調用該存儲過程,就與上面不一樣啦:
ibatis插件在執行SQL時會自動執行commit事務,因此,臨時表想何時刪就何時刪掉;
因爲程序能夠自動提交,因此查詢出來的數據永遠不存在重複插入這種狀況。
另外,事務指定,會話之間也是獨立的,當在plsql中執行兩次後,該會話已經出現重複數據,此時,使用程序調用一次存儲過程,數據依舊不會出現重複的狀況。
因此說,使用事務指定,會話之間的臨時表數據也是獨立的。
另外,事務指定還有一個特性就是:即便你沒有提交,直接關閉會話,臨時表的數據也會被清空。
最後說一點,當存儲過程要返回的數據是含有臨時表數據時,則使用事務指定的時候,對於臨時表進行新增或修改的操做都不能提交,由於一旦提交臨時表數據就會消失。
程序調用的時候也會報錯。