標籤:text sso 語句 tab 插入資料 jsb .net 完成 退出
熟悉Oracle的人,相比對暫存資料表(temporary table)並不陌生,很多情境對解決問題起到不錯的作用,開源庫Postgresql中,也有暫存資料表的概念,雖然和Oracle中暫存資料表名字相同,使用方法和特性也有類似的地方,但還是有很多不同的方面,下面就對比Oracle中暫存資料表舉例說明下。
1、Postgresql 暫存資料表的會話隔離性
Oracle中的暫存資料表,建立後,雖然各個會話間的資料是互相隔離的,也就是一個會話看不到其他會話的資料,但定義是共用的。而Postgresql中的暫存資料表,建立後,不但不同會話間的資料是相互隔離的,就連暫存資料表的定義也是不同會話間相互隔離的,也就是一個會話建立的暫存資料表,不能被其他會話看到,如所示:
session1:建立了暫存資料表t_tmp。
session2:以另一個會話登入相同使用者名稱和資料庫,查看session1中建立的暫存資料表,既不能查詢表,也不能查看錶結構,但可以通過系統檢視表看到該暫存資料表的存在。
2、Posgresql暫存資料表的易揮發性
Oracle中的暫存資料表,一個會話的資料在會話退出時會自動消失,但暫存資料表的定義一旦建立,就會已會一直存在,知道使用者刪除。而Postgresql的暫存資料表不是這樣,雖然會話退出會話資料也會自動消失,但定義也會隨著會話的退出而消失,也就是說,Postgresql中的暫存資料表的生命週期最長就是會話生命週期,甚至更短,:
是前面session1退出會話後,再次登入查詢之前建立的暫存資料表t_tmp,已經查不到了,哪怕是暫存資料表定義也沒了。
此外,在建立Postgresql暫存資料表時,還可以設定相關選項,使得暫存資料表在事務結束時消失,哪怕會話沒結束,也會消失,:
中,雖然建立暫存資料表成功了,但回頭查看時卻怎麼也看不到表定義,雖然接連建立了兩邊,還是看不到表定義,也不能查,原因就是定義暫存資料表是用了on commit drop選項,這意味著事務結束時,自動刪除暫存資料表,本人用的psql用戶端工具中,每當完成一個ddl或dml時,會預設認為事務結束,所以,建立暫存資料表的ddl語句被認為一個事務,雖然建立語句成功了,表也建立了,但隨後,事務結束後被很快又刪除了,所以,無論如何也看不到暫存資料表的定義。但如果顯式聲明一個事務的開始和結束,即使使用了on commit drop選項,建立暫存資料表後,也是可以看到定義的,插入資料後,也一樣可以看到資料,如所示:
然後,使用on commit drop選項建立的暫存資料表,一旦建立它的事務結束,暫存資料表和其中的資料也就消失了,如所示:
3、Postgresql暫存資料表資料的易揮發性
Oracle中暫存資料表的資料,會隨著會話事務或會話的結束而自動消失,主要看建立暫存資料表時的相關選項。Postgresql暫存資料表中的資料,也有類似的功能,除了通過on commit drop選項可以設定事務結束暫存資料表就消失外,還可以通過on commit相關選項,分別控制暫存資料表的資料在事務結束消失(僅僅資料消失,定義還存在)和會話結束消失(資料和表定義都消失),如下通過on commit delete rows定義了暫存資料表:
可以看到,雖然成功建立了暫存資料表,也往其中成功插入了資料,可是再查詢資料時,雖然表定義還在,但資料沒了,這是因為定義時用了on commit delete rows選項,就是事務結束,資料就消失,這裡的insert into語句預設為一個事務,執行完事務就算結束,所以,插入的資料立刻又消失了,如,顯式的定義了事務的開始和結束,事務期間,插入的資料可以查到:
但一旦事務結束,這些剛剛插入暫存資料表的資料又立刻不見了,如:
此外,還可以用on commit preserve rows選項來定義暫存資料表,通過該選項定義的暫存資料表,事務結束時,資料依然還會存在,直到會話結束為止,如所示:
可見,單個語句的insert事務結束後,依然可以查到資料的存在,這也是暫存資料表定義不設定on commit選項時的預設行為。
Postgresql中暫存資料表(temporary table)的特性和用法