Oracle中用子查詢建立臨時表 並賦值資料

shilei1發表於2014-08-10
直接看一下這個問題吧:
create global temporary table myTable as select e.empno,e.ename,e.deptno from emp e
這條語句為什麼只是建立了一個myTable表的結構而沒有將emp表中對應列的資料賦值過去???
怎樣才能在利用子查詢建立臨時表時同時賦值資料到臨時表中???

oracle中臨時表有兩種
on commit delete row;     --預設選項,在commit的時候將資料刪除
on commit preserve row; --在commit的時候將資料保留,會話結束後自動刪除。

由於第一種是預設值,你的命令裡面沒加選項預設為commit後刪除資料。
而ddl語句(create table 就是一個ddl)發出後,oracle會隱式的提交事務(commit),因此剛剛插入到臨時表的資料被自動刪除了。 這就是你沒查到資料的原因。

改成第二種方式就ok了:
create global temporary table myTable  on commit preserve row as select e.empno,e.ename,e.deptno from emp e;
追問
透過你說的那種方式建立的表,資料是複製過去了,但會話未結束不能刪除它,怎樣才能在建立之後又可以馬上刪除它??即:
create global temporary table myTable on commit preserve rows 
as select e.empno,e.ename,e.deptno from emp e;
drop table mytable--此語句執行失敗,怎樣讓它成功?
回答
對於會話級的臨時表,drop 之前先 truncate table mytable;
提問者評價
感謝各位的熱心幫助!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-1248842/,如需轉載,請註明出處,否則將追究法律責任。

相關文章