Oracle temp表的簡介
【前言】今天開發人員遇到一個temp表找不到資料的問題,稍微瞭解了一下,感覺還有很多知識點的,所以整理下來供大家參考;
【簡介】業務的實現過程中並不是所有的資料都是永久的存放在資料庫中的,有些業務在實現的過程中會通過一些暫存資料表或中間表去存放資料,當業務實現完成後暫存資料表或中間表的資料就可以刪除掉。基於這個業務特性,Oracle的GLOBAL TEMPORARY TABLE就滿足了這個業務的功能;
【注】有些開發人員會建立一個實體表,就臨時存放資料,當這個業務過程完成之後再把這個實體表drop掉,實現這個temp表的功能;
【詳細介紹】
概念描述:暫存資料表中的資料只對當前Session有效,每個Session都有自己的臨時資料,並且不能訪問其它Session的暫存資料表中的資料。因此,暫存資料表不需要DML鎖。
當一個會話結束(使用者正常退出 使用者不正常退出ORACLE執行個體崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行TRUNCATE 語句清空暫存資料表資料。
但不會清空其它會話暫存資料表中的資料,你可以索引暫存資料表和在暫存資料表基礎上建立視圖。同樣,建立在暫存資料表上的索引也是臨時的,也是只對當前會話或者事務有效。
類別:Oracle暫存資料表分為會話級暫存資料表和事務級暫存資料表。
會話級暫存資料表:指暫存資料表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,Oracle自動清除暫存資料表中資料。
事務級暫存資料表:指暫存資料表中的資料只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除暫存資料表中資料。
【建立指令碼】
ON COMMIT DELETE ROWS :建立事務級暫存資料表的方法
指令碼:
create global temporary table TEST1
( id number)
on commit delete rows ;
ON COMMIT PRESERVE ROWS :建立會話級暫存資料表的方法
指令碼:
create global temporary table TEST3
(id number)
on commit preserve rows ;
【實驗操作】
一、建立global temporary table TEST1,插入資料1,在session1中查看資料;
對於global temporary table ,session之間是隔離的狀態;
二、ON COMMIT DELETE ROWS的測試
資料只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除暫存資料表中資料。
三、ON COMMIT PRESERVE ROWS 會話級暫存資料表的測試
進行COMMIT之後還能查詢到插入的資料,雖然事務結束了,但是會話還是繼續存在的;
退出之後重新登入,表中的資料已經被truncate,因為會話已經結束了,這是基於會話層級的暫存資料表;
【總結】oracle的temp表的這兩種模式已經能夠滿足實際的開發過程中的關於資料臨時存放的問題了。理解技術就是為了更好的利用技術,理解了暫存資料表的這兩種設定,對於實際工作的進行有很大的協助的;