在我的存储过程中,我有一个这样的代码片段:
OPEN p_result FOR
SELECT *
FROM TABLE (CAST ( l_data AS Rpt_mapping_TableType));
COMMIT;
p_result
是类型 SYS_REFCURSOR
的IN 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
经常被过度使用。 除非将数据传递到另一个程序,否则隐式游标和批量收集通常更简单、更快捷。