使用SYS_REFCURSOR填充预言机集合类型并关闭光标



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

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

p_result 是类型 SYS_REFCURSORIN OUT参数。Rpt_mapping_TableType是用户定义的集合类型。因此,此光标将仅填充Rpt_mapping_TableType,然后调用此进程的程序将从Rpt_mapping_TableType读取结果。我的问题是这个片段中COMMIT有什么用?代码作者说这是一种关闭光标的方法。对吗? 我的另一个问题是,如果我只想填充集合,我什至需要做OPEN p_result FOR.毕竟我没有从光标读取任何内容,所以:

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

应该足够了。

不?

提交不会关闭游标。 如果是这样,那么你的代码就不起作用了。 (虽然它可以解锁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经常被过度使用。 除非将数据传递到另一个程序,否则隐式游标和批量收集通常更简单、更快捷。

相关内容

最新更新