1 | with tmp_table as()select × from tmp_table; |
使用这种方式创建临时表
优点:创建迅速简单,成句体现,不需要drop掉相应的表。可以将各表聚合
缺点:在抽字段select时排序会乱。
Oracle临时表 二
临时表分为两种
一、 会话级别(ON COMMIT PRESERVE ROWS;)
1 | CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> ) |
会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。即切换到另外一个窗口查询时,数据将被清空。
二、 事务级别(ON COMMIT DELETE ROWS;)
1 | CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> ) |
用户提交commit和回滚rollback事务的时候,临时表的数据自动清空。
创建临时表时,可以使用TYPE快捷创建,操作如下
1 | CREATE GLOBAL TEMPORARY TABLE TEMP_TABLE OF TYPE_NAME ON COMMIT DELETE ROWS; |
三、 删除临时表
1 | TRUNCATE TABLE <TABLE_NAME>; |
删除临时表时,偶尔会出现ORA-14452的错误,意思是有资源还在占用临时表,无法删除。需要找到临时表的会话,手动杀掉。
– 查找还在使用临时表的会话
–查不到dba_objects 是因为权限不够,需要system用户权限
1 | SELECT sid, serial# |
– 使用上面查出的sid和serial#,杀掉会话
1 | ALTER system kill session 'sid,serial#'; --不需要# 号 |
删除临时表还有一种方法: 就是等资源占用释放,不对临时表操作大约5分钟,就可以删除