項目中需要建立暫存資料表來暫時儲存一個表的資料,我們知道可以用子查詢來實現,文法很簡單:
create global temporary table temp1 as select * from jjr_tjjr_cyzgxx
我們通過查詢暫存資料表temp1,發現只是建立了永久表的一個結構,而並沒有將資料複製進去。
我改用永久表來實驗子查詢的功能,語句如下:
create table test as as select * from jjr_tjjr_cyzgxx
永久表資料複製了,但是暫存資料表沒有資料。難道要用Select 和 Insert去實現。去網上查閱了一些品質,總算找到了原因,問題也迎刃而解啦,下面給大家分享一下。
Oracle中暫存資料表有兩種:
1)on commit delete row; --預設選項,在commit的時候將資料刪除
2)on commit preserve row; --在commit的時候將資料保留,會話結束後自動刪除。
由於第一種是預設值,我的命令裡面沒加選項預設為commit後刪除資料。所以在我使用Select查詢的時候,發現暫存資料表裡沒有資料。究其原因我們可以歸納為Create table是DDL語句,在觸發後,Oracle會隱式的提交給交易處理,因此剛剛插入暫存資料表的資料就被自動刪除了。我們把Sql語句改成如下:
create global temporary table temp2 on commit preserve rows as select * from jjr_tjjr_cyzgxx
再用Select查詢temp2,我們如願的查到了資料。
但是問題又來了,通過這種方式建立的表,資料複製成功,但是會話結束後,不能刪除它,怎麼樣才能在建立之後又可以馬上刪除呢?我們在Drop table前先 truncate talbe talbename。文法如下:
TRUNCATE TABLE temp2drop table temp2