从Oracle游标大容量收集列的子集

从Oracle游标大容量收集列的子集,oracle,collections,plsql,cursor,Oracle,Collections,Plsql,Cursor,给出了一个不能更改的存储过程。它返回一个游标,结果中有许多列。在Oracle中,是否有一种简单的方法可以批量收集到游标提供的列的子集中 对于循环和新的收集类型,应避免使用。我不想从游标中获取所有数据,只想获取所需的数据 例如,要将批量收集到光标的所有列中,以下操作将起作用: FETCH s_cursor BULK COLLECT INTO staff_ids; 您不能立即处理不需要的列 您可以为游标的每一列声明PL/SQL表,如下所示: type c_col1 is table of s_cu

给出了一个不能更改的存储过程。它返回一个游标,结果中有许多列。在Oracle中,是否有一种简单的方法可以
批量收集到游标提供的列的子集中

对于
循环和新的收集类型,应避免使用
。我不想从游标中获取所有数据,只想获取所需的数据

例如,要将
批量收集到光标的所有列中,以下操作将起作用:

FETCH s_cursor BULK COLLECT INTO staff_ids;

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

您可以为游标的每一列声明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;

但是,这需要编写更多的代码,执行起来也需要更多的时间,而不仅仅是从游标大容量收集所有列并假装不存在不需要的列。

简短的回答是“否”,除非可以更改存储过程,否则您必须执行您说过不想执行的操作之一,或者编写一个新的存储过程来满足您的需要。

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