【问题标题】:Populate an oracle collection type using a SYS_REFCURSOR and close the cursor使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标
【发布时间】: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));

应该够了。

没有?

【问题讨论】:

    标签: oracle plsql cursor oracle11g


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2013-03-23
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2017-10-06
      • 2011-02-03
      相关资源
      最近更新 更多