1

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

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这个片段的用途是什么?代码作者说这是关闭游标的一种方式。这样对吗?我的另一个问题是,如果我只想填充集合,我是否还需要这样做OPEN p_result FOR。毕竟我没有从光标中读取任何内容,所以:

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

应该足够了。

不?

4

1 回答 1

1

提交不会关闭游标。如果是这样,那么您的代码将无法正常工作。(尽管它可能会从 a 中解锁行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经常被过度使用。除非您将数据传递给另一个程序,否则隐式游标和批量收集通常更简单、更快。

于 2012-08-22T18:01:27.203 回答