请教:Oracle中临时表替代方案?

就是just4 2014-03-12 09:25:03
最近折腾Oracle,请教各位大大几个简单问题:

1、Oracle存储过程中对有没有好的临时表替代方案?Oracle临时表比较麻烦,有几个小问题:
一是在PLSQL中需要动态创建,拼字符串总是麻烦,易出错,易出问题
二是如提前创建,往往需求是随着代码展开而发生变化的,提前预知所有的内容和结构是不可能的
三是如动态创建,最大麻烦是DDL并发问题,一个在create,一个在drop肯定有问题
三是如动态创建,对于on commit preserve rows的临时表想drop掉还得加奇淫技巧trunacate

如说Oracle中避免使用临时表,但稍复杂的sp肯定都很需要一个“结果集”用于后续多种引用的,哪还有什么好的办法?

后续引用都用用子查询,这个扯蛋!
用with表达式,只能紧跟一段语句,且还不能with xx as () begin ...1;...2; end;
用游标cursor,用这个都是一行一行处理,一个一个标量分开来与集合处理方式有点背得太远
用表类型(table由record或object构成),但表类型是数组不是表,除非强制转换成集合处理时才能满足select * from tabtype(xx);但表类型提前创建又是一个麻烦,与其用此还不如用临时表!

各位仁兄还有什么好的经验和办法没,?

...全文
440 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2014-04-24
  • 打赏
  • 举报
回复
这个视具体环境而定的吧,是用临时表,还是动态建表,还是游标或数组。个人觉得挺方便的。这么讨论太泛了
CT_LXL 2014-04-24
  • 打赏
  • 举报
回复
引用 7 楼 LOVESONGFOREVER 的回复:
[quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 just4 的回复:] [quote=引用 1 楼 zlloct 的回复:] 我们工作中一般都用的TYPE来处理
举个例子对照下[/quote] declare type r is record( i number, w number); r1 r; begin select 1 a, 2 b into r1 from dual; dbms_output.put_line(r1.i||r1.w); end; 如果需要存储多条记录(表结构): type t is table of r index by pls_integer;[/quote] 存储过程里每次这样执行时都创建TYPE?[/quote] 这里只是一个临时的type,并不是一个像TABLE 一样的对象永久存在数据库中,就好比一个变量的作用
garfieldzf 2014-04-24
  • 打赏
  • 举报
回复
引用 3 楼 zlloct 的回复:
[quote=引用 2 楼 just4 的回复:] [quote=引用 1 楼 zlloct 的回复:] 我们工作中一般都用的TYPE来处理
举个例子对照下[/quote] declare type r is record( i number, w number); r1 r; begin select 1 a, 2 b into r1 from dual; dbms_output.put_line(r1.i||r1.w); end; 如果需要存储多条记录(表结构): type t is table of r index by pls_integer;[/quote] 存储过程里每次这样执行时都创建TYPE?
yuppy 2014-04-23
  • 打赏
  • 举报
回复
遇到了同样的问题.... type到底怎么用?
shenlele088 2014-04-01
  • 打赏
  • 举报
回复
1、Oracle存储过程中对有没有好的临时表替代方案?Oracle临时表比较麻烦,有几个小问题: 一是在PLSQL中需要动态创建,拼字符串总是麻烦,易出错,易出问题 二是如提前创建,往往需求是随着代码展开而发生变化的,提前预知所有的内容和结构是不可能的 【如果你后续都是很多子查询,为什么不能预订下来。不过有改动,你后续代码都要改,莫不如就定死临时表的结构】 三是如动态创建,最大麻烦是DDL并发问题,一个在create,一个在drop肯定有问题 【如果多用户都要有这类需求,那就不是建临时表了,而是实体表或物化视图了】 三是如动态创建,对于on commit preserve rows的临时表想drop掉还得加奇淫技巧trunacate 【若单用户truncate也无所谓】 整个不太明白。 目前看大致应该如此: 单用户:可以使用临时表,但此时db的优势已不多,其实一般都是用应用实现。 多用户:建立统一体系。 如:一个过程定期在扫,然后所有应用使用其结果表。当然不限如此
流浪川 2014-03-12
  • 打赏
  • 举报
回复
进来学习,这个真心没有什么好方案。。
CT_LXL 2014-03-12
  • 打赏
  • 举报
回复
引用 2 楼 just4 的回复:
[quote=引用 1 楼 zlloct 的回复:] 我们工作中一般都用的TYPE来处理
举个例子对照下[/quote] declare type r is record( i number, w number); r1 r; begin select 1 a, 2 b into r1 from dual; dbms_output.put_line(r1.i||r1.w); end; 如果需要存储多条记录(表结构): type t is table of r index by pls_integer;
就是just4 2014-03-12
  • 打赏
  • 举报
回复
引用 1 楼 zlloct 的回复:
我们工作中一般都用的TYPE来处理
举个例子对照下
CT_LXL 2014-03-12
  • 打赏
  • 举报
回复
引用 楼主 just4 的回复:
最近折腾Oracle,请教各位大大几个简单问题: 1、Oracle存储过程中对有没有好的临时表替代方案?Oracle临时表比较麻烦,有几个小问题: 一是在PLSQL中需要动态创建,拼字符串总是麻烦,易出错,易出问题 二是如提前创建,往往需求是随着代码展开而发生变化的,提前预知所有的内容和结构是不可能的 三是如动态创建,最大麻烦是DDL并发问题,一个在create,一个在drop肯定有问题 三是如动态创建,对于on commit preserve rows的临时表想drop掉还得加奇淫技巧trunacate 如说Oracle中避免使用临时表,但稍复杂的sp肯定都很需要一个“结果集”用于后续多种引用的,哪还有什么好的办法? 后续引用都用用子查询,这个扯蛋! 用with表达式,只能紧跟一段语句,且还不能with xx as () begin ...1;...2; end; 用游标cursor,用这个都是一行一行处理,一个一个标量分开来与集合处理方式有点背得太远 用表类型(table由record或object构成),但表类型是数组不是表,除非强制转换成集合处理时才能满足select * from tabtype(xx);但表类型提前创建又是一个麻烦,与其用此还不如用临时表! 各位仁兄还有什么好的经验和办法没,?
我们工作中一般都用的TYPE来处理

17,140

社区成员

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

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