近日接手一个分析类老项目改造工作,用户要求使用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)方式可以在存储过程中象访问普通表一样访问表集合类型实例里的数据。
分享到:
相关推荐
临时表在Oracle中用于在单个会话中存储临时数据,这些数据只对创建它们的会话可见,会话结束时,临时表及其数据都会被自动删除。 1. **创建临时表**:使用`CREATE GLOBAL TEMPORARY TABLE`语句创建临时表,例如: ...
Oracle存储过程是数据库管理系统中一组预编译的SQL语句,允许开发人员创建复杂的业务逻辑,提高数据库操作的效率和安全性。在Oracle中,编写高效且优化的存储过程是提升系统性能的关键步骤。 首先,存储过程的编写...
Oracle存储过程是数据库开发中的重要组成部分,用于封装复杂的业务逻辑和数据库操作,提高代码复用性和执行效率。本文主要分享一些在编写Oracle存储过程时的经验和优化措施。 首先,跨库操作应尽量避免直接引用其他...
d) 数据量大的临时表建立索引时,将其放在独立子存储过程中,确保索引被有效利用。 e) 存储过程结束时,务必清除临时表,先truncate再drop,避免长时间锁定系统表。 f) 减少大临时表与其他大表的连接查询和修改,...
- 另外,为了提高性能,可以考虑使用表变量或临时表来替代永久表。 通过上述步骤,我们成功地在 SQL Server 中创建了一个类似 Oracle 序列的存储过程,可以用来生成唯一的序列值。这种方法虽然简单,但在许多场景下...
几乎所有主流的大型数据库管理系统如Oracle、Microsoft SQL Server等均支持存储过程,而像MS Access这样的轻量级数据库虽然不直接支持存储过程,但提供了参数化查询作为替代方案。 ### 为什么使用存储过程? 1. **...
- **临时表空间(Temporary Tablespaces)**:为临时表提供存储空间。 - **回滚表空间(Rollback Tablespaces)**:存储事务处理期间的数据变化信息。 #### 三、物理表空间的删除命令 当需要删除某个物理表空间时,...
Oracle数据库作为一款广泛使用的数据库管理系统,在日常的数据库管理与维护过程中,系统表扮演着至关重要的角色。系统表是Oracle数据库自带的、用于存储数据库元数据(即关于数据的数据)的一类特殊表。通过查询这些...
Oracle存储过程是数据库开发中的重要组成部分,主要用于封装复杂的业务逻辑和数据库操作,以提高效率和代码复用。本文主要分享了在开发和优化Oracle存储过程时的一些关键经验和技巧,适用于数据库开发人员,特别是...
在数据库维护过程中,还应考虑到数据库的存储空间问题,使用临时表可以在事务提交后自动删除其中的行,有助于处理临时数据。此外,簇与簇表也是早期版本中用于优化存储空间使用和提高性能的数据库对象。 Oracle...
4. **子查询和临时表**:子查询可能会导致性能问题,书中的案例可能会演示如何通过重写查询、使用WITH子句(公共表表达式)或者临时表来优化子查询。 5. **分页查询**:在大数据量场景下,高效的分页查询必不可少。...
Oracle 9i引入了对临时表空间的优化,主要用于存储临时数据,如排序和并行查询。临时表空间可以设置为全局或私有,根据应用需求进行调整,以优化临时段的管理。 **5. 其他新功能** Oracle 9i还包含其他一些新特性...
- **临时表空间(Temporary Tablespace)**:用于执行临时排序操作、分组操作等,数据在会话结束时自动清除。 - **工具表空间(Tools Tablespace)**:通常用于存放备份恢复所需的临时数据或其他工具使用的数据。 - *...
3. **全球临时表(GTT)替代方案**:Oracle全球临时表提供了另一种处理临时数据的方式,其生命周期与会话绑定,可以在某些场景下替代专用临时表。 四、表空间选择:优化空间管理 1. **本地管理表空间**:相较于...
- 优化子查询和联接操作:考虑子查询的替代方案,如使用连接或临时表。 - 使用绑定变量避免硬解析:硬解析会增加系统开销,而绑定变量可以复用解析计划。 5. 维护数据库统计信息 定期执行ANALYZE命令,确保统计...
- **流池**:用于缓存大对象和临时表空间的数据。 - **Java池**:用于存储Java对象。 - **PGA**(Program Global Area):每个会话都有的私有内存区域,合理分配PGA大小可以提高并发性能。 #### 六、物理I/O优化 ...
- **简介:** 用于存储事务处理过程中产生的临时数据。 - **创建回滚段:** 使用CREATE ROLLBACK SEGMENT命令创建。 - **更改回滚段:** 包括调整大小、更改存储参数等。 - **删除回滚段:** 使用DROP ROLLBACK ...
6. **方案(Schema)**:方案是Oracle中与用户关联的逻辑结构,它包含用户创建的所有对象,如表、视图和存储过程。当用户创建对象时,Oracle会自动创建一个与用户名相同的方案。 7. **交互式命令**:`&`作为变量...