oracle 临时表拼接,Oracle存储过程中使用临时表的替代方案 | 学步园

近日接手一个分析类老项目改造工作,用户要求使用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 TypeTestRecord Is Object(Id int,Name Varchar2(20));

2、再建一个集合类型

Create Type TestTable  Is Table Of TestRecord;

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

Create Procedure P_Test(p_type int,retcur out Sys_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字段     Select TestRecord(sId,sName)   --注意这里的方式

Bulk collect into datatab

From T_Test

Where sType=p_type;

--打开游标返回数据     Open retcur For select * from table(datatab);

End;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle存储过程,你可以使用临时存储临时数据。临时是在会话级别创建的,仅在当前会话可见,并在会话结束后自动删除。以下是使用临时的一般步骤: 1. 创建临时使用CREATE GLOBAL TEMPORARY TABLE语句创建临时。临时可以是全局临时(GLOBAL TEMPORARY TABLE)或本地临时(LOCAL TEMPORARY TABLE)。全局临时在所有会话之间共享结构定义,但数据仅在当前会话可见。本地临时在会话级别创建和使用,并且只在当前会话可见。 2. 定义临时结构:在CREATE TABLE语句定义临时的列和其他约束。 3. 在存储过程使用临时:在存储过程,你可以像使用任何其他一样使用临时。你可以插入、更新、删除、查询临时的数据,并在存储过程执行期间将其作为间结果使用。 4. 清空或删除临时:当你需要清空或删除临时的数据时,可以使用TRUNCATE TABLE或DELETE语句。TRUNCATE TABLE语句会快速删除的所有数据,而保留结构。DELETE语句可以根据条件删除的数据。 5. 存储过程结束后临时自动删除:一旦存储过程执行完毕或会话结束,临时会自动删除,无需手动清理。 使用临时可以在存储过程方便地存储和处理临时数据,提高性能和简化逻辑。注意,临时的数据仅在当前会话可见,不会对其他会话产生影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值