从 Oracle 游标批量收集列的子集

Posted

技术标签:

【中文标题】从 Oracle 游标批量收集列的子集【英文标题】:Bulk collecting a subset of columns from Oracle Cursor 【发布时间】:2010-11-19 10:44:28 【问题描述】:

给出了一个无法更改的存储过程。它返回游标,结果中有许多列。 Oracle 中是否有一种简单的方法来BULK COLLECT INTO仅游标提供的列的子集?

FOR 应该避免循环和新的集合类型。我不想从游标中获取所有数据,只是需要的数据。

例如,BULK COLLECTION INTO 光标中的所有列都可以:

FETCH s_cursor BULK COLLECT INTO staff_ids;

【问题讨论】:

嗯,我看到你为没有新的集合类型添加了额外的限制。你想解决什么问题?是为了提高性能吗? 是的,基本上我想使用该语言的所有资源来避免性能泄漏。我想我将不得不复制一个存储过程并删除不需要的列,以避免获取比需要更多的数据。即使这会导致代码重复。 是的,为避免性能泄漏,您需要修改/新的存储过程。打开游标后丢弃不需要的列意味着数据库已经完成了所有艰苦的工作,因此已经发生了性能泄漏。 【参考方案1】:

简短的回答是“不”,您将不得不做您说过不想做的事情之一,除非您可以更改存储过程,或者编写一个新的存储过程来执行您的操作想要。

【讨论】:

【参考方案2】:

您不能立即处理不需要的列。

您可以像这样为游标的每一列声明 PL/SQL 表:

type c_col1 is table of s_cursor.col1%type index by pls_integer;
type c_col2 is table of s_cursor.col2%type index by pls_integer;
type c_col3 is table of s_cursor.col3%type index by pls_integer;
t_col1 c_col1;
t_col2 c_col2;
t_col3 c_col3;

并批量收集到这些表中:

fetch s_cursor bulk collect into t_col1, t_col2, t_col3;

并删除您不需要的集合:

t_col2.delete;
t_col3.delete;

但是,与只是从游标中批量收集所有列并假装不存在不需要的列相比,这需要编写更多代码并且需要更多时间来执行。

【讨论】:

以上是关于从 Oracle 游标批量收集列的子集的主要内容,如果未能解决你的问题,请参考以下文章

从引用游标中获取批量收集时出现不一致的数据类型错误

视图、游标是啥?

为啥打开游标后批量收集加快了抓取速度?

如何优化使用游标的 PL/SQL 代码

如何使用游标和批量收集填充嵌套表(带有嵌套对象)

PLSQL游标批量更新数据问题