项目中需要创建临时表来暂时存储一个表的数据,我们知道可以用子查询来实现,语法很简单:
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 temp2
drop table temp2