咱們在建立數據表的時候,若沒有特殊的指明,那麼咱們建立的表是一個永久的關係型表格,也就是說,這個表格中對應的數據,除非是咱們顯示的刪除的話,表中的數據是永遠都存在的。 數據庫
相對應的,在Oracle數據庫中還有一種類型的表,叫作臨時表。這個臨時表跟永久表最大的區別就是表中的數據不會永遠的存在。當一個會話結束或者事務結束的時候,這個臨時表中的數據,不用用戶本身刪除,數據庫本身會自動清除。 spa
1、 事務臨時表的管理。 日誌
(1) 事務臨時表的建立。 事務
Oracle數據庫根據臨時表的性質不一樣,能夠分爲事務臨時表與會話臨時表。事務臨時表是指數據只有在當前事務內有效。通常狀況下,若是在建立數據表的時候,沒有特殊指明這表是會話臨時表的話,則該表默認爲事務臨時表。 table
咱們能夠如下面的語句建立事務臨時表。 語法
Create global temporary table Temp_user
(ID NUMBER(12) Primary key,name varchar2(10)); 方法
這個建立臨時表的語句中,雖然沒有顯性的指明該表是事務臨時表,可是,默認的狀況下,若沒有指明是什麼臨時表的話,系統默認是事務臨時表。咱們要建立事務臨時表時,能夠不指定關鍵字。可是,這查看起來比較麻煩。我建議,不管在創建什麼臨時表,都要利用具體的關鍵字來顯形的指明,這你們看起來都方便。通常能夠利用ON COMMIT DELETE ROWS關鍵字來講明該表就是事務性的臨時表,而不是會話性質的臨時表。(注意:DDL會自動隱式提交事務,因此在procedure中用到臨時表需稍加註意) im
(2) 事務臨時表數據的變化分析。 數據
事務臨時表的話,當事務結束的時候,就會清空這個事務臨時表。因此,當咱們在數據庫臨時表中插入數據後,只要事務沒有提交的話,該表中的數據就會存在。可是,當事務提交之後,該表中的數據就會被刪除。並且,這個變化不會在重作日誌中顯示。
具體事務臨時表與會話臨時表有什麼區別,咱們在介紹完會話臨時表後會詳細介紹。 查詢
2、 會話臨時表的管理。
會話臨時表,顧名思義,是指數據只在當前會話內有效的臨時表。關閉當前會話或者進行新的鏈接以後,數據表中的內容就會被清除。那會話臨時表跟事務臨時表到底有什麼區別呢?咱們以一個實例來看其中的區別。
(1) 首先,建立一個會話臨時表。
CREATE GLOBAL TEMPOPARY TABLE TEMP_USER
(ID NUMBER(12) Primary key,name varchar2(10))
ON COMMIT PRESERVE ROWS;
也就是說,會話臨時表跟事務臨時表的建立語法大體相同,只有最後的關鍵字有區別。不過兩個表雖然相似,可是其內部的處理機制仍是有比較大的區別。
(2) 往該表中插入數據。
Insert into TEMP_USER values(1001,’victor’);
往數據庫臨時表中插入數據的方法,跟往普通表中插入數據的方法是同樣的,都利用insert into語句進行操做。該臨時表的數據在會話結束以前都是存在這個表格中的。
(3) 提交該事務並查詢相關記錄。
咱們利用COMMIT的語句把該事務提交之後,再用SELECT查詢語句進行查詢。咱們知道,若該表是事務臨時表的話,則當該事務結束之後,該表中的內容就會被刪除。可是,這是會話臨時表,因此即便該事務提交了,可是,利用SELECT語句進行查詢時,仍然能夠查到該條員工記錄。
(4) 結束當前會話,並從新鏈接數據庫。
關閉當前會話,重新鏈接到數據庫後,再利用SELECT語句查詢時,會有什麼結果呢?此時,就查不到咱們剛纔插入的數據。這也就是說,在關閉對話的時候,數據庫系統已經把原有的數據刪除了。從以上的分析咱們能夠看中,會話臨時表與事務臨時表主要的差別就在於刪除數據時機的不一樣。事務性臨時表是在事務提交的時候清除數據,而會話性臨時表則是在關閉當前會話的時候清除臨時表。只要當前會話沒有關閉,即便事務完成了,會話臨時表中的數據仍然存在,不會被清除。