SOS:关于Oracle存储过程中的临时表的用法

ww_cain 2011-09-07 01:44:16
SOS:关于Oracle存储过程中的临时表的用法
1、ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
2、ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
3、临时表(无论会话级还是事务级)中的数据都是会话隔离的,不同session之间不会共享数据。
4、在存储中使用事务级临时表时,注意commit前删除掉本事务的数据,否则可能会出现数据不断增加的情况(原因尚未搞明白)。
5、 两种临时表的语法:
create global temporary table 临时表名 on commit preserve|delete rows;
用preserve时就是SESSION级的临时表,
用delete就是TRANSACTION级的临时表。

我的需求是临时表仅仅在这次调用过程时有效,表也不需要保留,用preserve还是用delete。
...全文
206 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenChiM888 2011-09-07
  • 打赏
  • 举报
回复
这个没问题,表在那里就在那儿呗,不影响你什么事情,用就往里插入数据,不用就放着,没影响。
oracle的临时表就这样,机制不同没必要往一起靠。

[Quote=引用 10 楼 ww_cain 的回复:]

一个用户的数据不会超过一千条数据,用临时表的目的是从大数据表中将单个用户的数据提出来做写分类的统计,所以想到了临时表,但发现他这个跟MSSQL的临时表概念不一样。
[/Quote]
ww_cain 2011-09-07
  • 打赏
  • 举报
回复
一个用户的数据不会超过一千条数据,用临时表的目的是从大数据表中将单个用户的数据提出来做写分类的统计,所以想到了临时表,但发现他这个跟MSSQL的临时表概念不一样。
BenChiM888 2011-09-07
  • 打赏
  • 举报
回复
那就动态建,动态删除呗。
不过说实话,不明白你需求的目的。

[Quote=引用 8 楼 ww_cain 的回复:]

with 不是我想要的结果,用临时表就是想在当前过程都可以使用这个临时表,用完就干掉。
[/Quote]
ww_cain 2011-09-07
  • 打赏
  • 举报
回复
with 不是我想要的结果,用临时表就是想在当前过程都可以使用这个临时表,用完就干掉。
BenChiM888 2011-09-07
  • 打赏
  • 举报
回复
用完就没了。
但是要注意,这个所谓的临时是不能加索引等东西的,执行速度上需要考虑下。

[Quote=引用 6 楼 ww_cain 的回复:]

引用 4 楼 benchim888 的回复:

1、with as 需要紧着后面写sql,分开写是不行的
2、临时表需要赋权。


with as 紧跟着 sql 这个没有问题,就想知道他存在周期是不是跟表一样,一直存在。
[/Quote]
ww_cain 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 benchim888 的回复:]

1、with as 需要紧着后面写sql,分开写是不行的
2、临时表需要赋权。
[/Quote]

with as 紧跟着 sql 这个没有问题,就想知道他存在周期是不是跟表一样,一直存在。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 benchim888 的回复:]
oracle 当中虽然临时表称为“临时”,但是这个临时指的是数据的临时,并不是说表的临时,这个临时表建立之后表就真是存在了,与sqlserver不同,sqlserver的临时表指的是表的临时。

===> 因此你说表也不需要保留,是不太合逻辑的。

用preserve 还是delete 看你的需求,如果你希望临时表中的数据在你的会话存在期间一直存在,那就用preserve
否则用dele……
[/Quote]
我举双手赞成
BenChiM888 2011-09-07
  • 打赏
  • 举报
回复
1、with as 需要紧着后面写sql,分开写是不行的
2、临时表需要赋权。

ww_cain 2011-09-07
  • 打赏
  • 举报
回复
如果用with是不是还是数据是临时的,如一楼所说,表还是实际存在的。
另外我建的临时表是否还需要赋上访问的权限。
coolkisses 2011-09-07
  • 打赏
  • 举报
回复
如果都是临时的,那就用 with 吧

-- 建立临时表
with tmp_table as
(select * from table)
-- 后面随便怎么做了
select * from tmp_table
where XXX
BenChiM888 2011-09-07
  • 打赏
  • 举报
回复
oracle 当中虽然临时表称为“临时”,但是这个临时指的是数据的临时,并不是说表的临时,这个临时表建立之后表就真是存在了,与sqlserver不同,sqlserver的临时表指的是表的临时。

===> 因此你说表也不需要保留,是不太合逻辑的。

用preserve 还是delete 看你的需求,如果你希望临时表中的数据在你的会话存在期间一直存在,那就用preserve
否则用delete

====>个人建议,直接用preserve就可以了。
在一进入存储过程的时候 execute immedaite 'truncate table 临时表名';
然后下面随便你怎么用了,不同的session调用互不干涉,当退出session之后数据被自动清掉。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧