设为首页 收藏本站
查看: 649|回复: 0

[经验分享] Oracle存储过程中使用临时表的替代方案

[复制链接]

尚未签到

发表于 2016-8-7 06:38:45 | 显示全部楼层 |阅读模式
   近日接手一个分析类老项目改造工作,用户要求使用Oracle数据库(原先版本为SQL Server2005),由于原项目中大量使用存储过程实现复杂的业务数据查询,在SQL Server中由于使用表值函数、临时表等非常方便,所以当时实现起来并不费事,而现在转为Oracle就不一样了,限制太多(说实话:甲骨文的东西实在没有微软的用起来舒服)。

比如存储过程吧,直接建临时表,再往里面塞加工后数据,Oracle里不允许,非要用动态查询语句,如:

strSql := 'Create Global temporary Table Tmp_Test(...)';

Execute Immediate strSql;

strSql := 'Insert into Tmp_Test ....';

Execute Immediate strSql;

很麻烦,在拼接动态语句时很容易出错,往往运行后才知道有没有问题。

查阅了很多资料也没有使用临时表的好办法。


后来想到用集合变量来代替临时表,并使用游标返回数据。具体方法如下:

1、先建对象类型

Create TypeTestRecordIs Object(Idint,NameVarchar2(20));


2、再建一个集合类型

Create TypeTestTableIs Table OfTestRecord;


3、存储过程中使用方法如下:

Create ProcedureP_Test(p_typeint,retcuroutSys_refcursor)
Is
rec1 TestRecord;
rec2 TestRecord;
datatab TestTable;
Begin
--实例化一条记录
rec1:=TestRecord(1,'test01');
--用此方法扩展表集合
datatab.Extend;
--往集合中插入数据
datatab(1):=rec;
--实例化另一条记录再插入
rec2:=TestRecord(2,'test02');
datatab.Extend;
datatab(2):=rec;
--可以使用以上方法往表集合动态插入数据行

--下面是批量插入数据的方法
--假设存在表 T_Test 并包含sId,sName和stype字段
SelectTestRecord(sId,sName)--注意这里的方式
Bulk collect intodatatab
FromT_Test
WheresType=p_type;

--打开游标返回数据
OpenretcurForselect*fromtable(datatab);
End;


4、说明:上面两个类型必须在表空间中先建好,Oracle中不允许使用游标方式打开本地集合,使用table(datatab)方式可以在存储过程中象访问普通表一样访问表集合类型实例里的数据。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254021-1-1.html 上篇帖子: JSP: 连接ORACLE数据库读取数据(含存储过程) 下篇帖子: 创建Oracle数据库用户过程小结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表