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

时间:2012-08-15 20:14:31

标签: oracle plsql cursor oracle11g

在我的存储过程中,我有一个这样的代码片段:

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

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

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

应该足够了。

没有

1 个答案:

答案 0 :(得分: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经常被过度使用。除非您将数据传递给另一个程序,否则隐式游标和批量收集通常会更简单,更快。