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

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 17:11 点击:

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

view plaincopy to clipboardprint?create global temporary table temp1  as select * from jjr_tjjr_cyzgxx 
create global temporary table temp1  as select * from jjr_tjjr_cyzgxx
我们通过查询临时表temp1,发现只是创建了永久表的一个结构,而并没有将数据复制进去。

 \

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

view plaincopy to clipboardprint?create table test as as select * from jjr_tjjr_cyzgxx 
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语句改成如下:

view plaincopy to clipboardprint?create global temporary table temp2  on commit preserve rows as select * from jjr_tjjr_cyzgxx 
create global temporary table temp2  on commit preserve rows as select * from jjr_tjjr_cyzgxx再用Select查询temp2,我们如愿的查到了数据。

但是问题又来了,通过这种方式创建的表,数据复制成功,但是会话结束后,不能删除它,怎么样才能在创建之后又可以马上删除呢?我们在Drop
 table前先 truncate talbe talbename。语法如下:

view plaincopy to clipboardprint?TRUNCATE TABLE temp2 
drop table temp2 

 作者“gavinloo的专栏”

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Table函数使用简介
    • Oracle数据库Constraint约束的常用操作及异常处理
    • Bulk Collect性能分析(zz)
    • export/import的使用
    • OCP043第十五讲 Database Security
    • ORACLE10gr2数据导入MySQL方案
    • oracle 让sys用户可以使用isqlplus
    • 在oracle数据库下使用iSQL*Plus DBA访问数据库
    • Oracle行列转换小结
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1