Oracle用子查询创建临时表的问题总结

项目中需要创建临时表来暂时存储一个表的数据,我们知道可以用子查询来实现,语法很简单:

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






  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值