使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标

Posted

技术标签:

【中文标题】使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标【英文标题】:Populate an oracle collection type using a SYS_REFCURSOR and close the cursor 【发布时间】:2012-08-15 20:14:31 【问题描述】:

在我的存储过程中,我有一个这样的代码 sn-p:

OPEN p_result FOR
SELECT *
FROM TABLE (CAST ( l_data AS Rpt_mapping_TableType));
COMMIT;

p_resultIN OUT 类型的参数SYS_REFCURSORRpt_mapping_TableType 是用户定义的集合类型。 所以这个游标只会填充 Rpt_mapping_TableType,然后调用这个 proc 的程序将从 Rpt_mapping_TableType 读取结果。 我的问题是COMMIT 在这个 sn-p 中有什么用?代码作者说这是关闭游标的一种方式。这样对吗?我的另一个问题是,如果我只想填充集合,我什至需要做OPEN p_result FOR。毕竟我没有从光标读取任何内容:

SELECT *  FROM TABLE (CAST ( l_data AS Rpt_mapping_TableType));

应该够了。

没有?

【问题讨论】:

【参考方案1】:

提交不会关闭游标。如果是这样,那么您的代码将无法正常工作。 (虽然它可以从 FOR UPDATE 解锁行,从而导致其他问题。)这是一个不关闭游标的提交示例:

SQL> variable test refcursor
SQL> begin
  2  open :test for select 1 from dual;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> print test;

         1
----------
         1

SQL>

如果您只是想填充一个集合,最好使用SELECT ... BULK COLLECT INTO ... 之类的东西。 (并且可能使用LIMIT。)关键字CURSOR 经常被过度使用。除非您将数据传递给另一个程序,否则隐式游标和批量收集通常更简单、更快。

【讨论】:

以上是关于使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - pl sql 从 SYS_REFCURSOR 中选择

Oracle JDBC从过程中获取SYS_REFCURSOR

如何使用 out sys_refcursor 参数执行 oracle 过程?

Oracle ref cursor和sys_refcursor

oracle 合并多个sys_refcursor

从 Java 创建并将 SYS_REFCURSOR 作为输入参数传递给 Oracle 过程