Oracle 臨時表

Oracle中的臨時表
臨時表有兩種一種
1是事務級別的臨時表
它在事務結束的時候自動清空記錄.

2 是會話級的的臨時表
它在我們訪問數據庫是的一個會話結束後自動的清 空。

關於臨時表多用戶並行不是問題,一個會話從來不會阻止另一個會話使用臨時表。即使“鎖定”臨時表,一個會話也不會阻止其他會話使用它們的臨時表。   如果有在SQL SERVER 和\或sybase中使用臨時表的經驗,需要主要考慮的不是執行select x,y ,z into #temp from some_table 來創建和裝載臨時表,而是:   1.對於每一個數據庫,創建所有的temp表作爲全局臨時表。這將作爲應用程序安裝的一部分完成,就像創建永久表一樣。   2.只要在過程中簡單的 insert into temp(x,y,z) selelct x,y,z from some_table。只是理解這點,這裏的目的不是運行存儲過程創建表。在Oracle中這樣做不是正確的方法。DDL是一種消耗資源非常大的操作,在 運行時儘量不要使用,應用程序需要的臨時表應在應用程序安裝時創建,而不是在運行時創建。Oracle中的臨時表和其他數據庫的臨時表是相似的,在每個數 據庫中創建臨時表一次,不必在數據庫中的每個存儲過程中創建一次。臨時表總是存在的,他們作爲對象存在於數據字典中,並且總是保持爲空,直到有會話在其中 放入數據。  所有我在這裏說明如果我們在存儲過程中建臨時表,每次都建立一個那麼我的系統隨着用戶的操作調用此存儲過程,每次多一個這樣的表,我們在不知不覺中數據庫中的表的數量會越來越多,而我們還不知道會存在很大的隱患的所有說這點不可小視,爲了我們的系統能在客戶那裏平穩、安全的運行我們一定要注 意這樣的問題。如果不手動Drop 表,臨時表還是在數據字典中存在的。

Oracle臨時表攻略

環境準備
建立兩種臨時表 ,本例使用scott用戶下的emp表中的數據作爲臨時表數據

--建立兩張臨時表

--建立事務級臨時表(defualt)
create
global
temporary table emp_delete on commit delete rows
as select *
from emp
where 1=2

--建立會話級臨時表
create
global
temporary table emp_preserve on commit preserve rows
as select *
from emp
where 1=2

下面說一下兩種臨時表的異同
相同點:兩種表都不能永久的保存記錄。他們都是用臨時表空間。
不同點:事務級臨時表臨時表在提交後就回被清空。
              而會話級臨時表只有在SESSION 斷開後纔會被清空。

臨時表的使用範圍:
建議:在邏輯相當複雜,並且生成的數據


實驗步驟如下

向事務級表插入數據

insert into EMP_DELETE

select * from emp


不提交而是在同一個回話中查詢這個表的數據
select * from EMP_DELETE 這時候是有數據的。
確認提交
再次查詢臨時表的數據。
select * from EMP_DELETE
這個時候是沒有數據的。在提交的時候,是事務級臨時表已經被清空了。



再對會話級臨時表做相同的動作。插入數據
insert into EMP_PRESERVE
select * from emp
查詢
select *
from EMP_PRESERVE
確認提交
再次查詢
select *
from EMP_PRESERVE

仍然有數據。
但是在別的session中卻查詢不出數據。

select *
from EMP_PRESERVE

當我們關閉這個session的窗口時,數據就被清空了。

當我們使用union 將多個結果集區分的時候,可以使用with構建一張虛擬的臨時表
With fis as (select * from emp)

select *
from fis
where empno <7900

union

select *
from fis
where deptno=20

使用它你不用再建立臨時表。
但是With 只能在select 中使用,並且只對一條語句使用。

發佈了63 篇原創文章 · 獲贊 0 · 訪問量 1933
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章