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

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

create global temporary table temp1 as select * from jjr_tjjr_cyzgxx

我们通过查询临时表temp1,发现只是创建了永久表的一个结构,而并没有将数据复制进去。

0818b9ca8b590ca3270a3433284dd417.png

我改用永久表来试验子查询的功能,语句如下:

create table test as as select * from jjr_tjjr_cyzgxx

0818b9ca8b590ca3270a3433284dd417.png

永久表数据复制了,但是临时表没有数据。难道要用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值