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