使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标
Posted
技术标签:
【中文标题】使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标【英文标题】:Populate an oracle collection type using a SYS_REFCURSOR and close the cursor 【发布时间】:2012-08-15 20:14:31 【问题描述】:在我的存储过程中,我有一个这样的代码 sn-p:
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
在这个 sn-p 中有什么用?代码作者说这是关闭游标的一种方式。这样对吗?我的另一个问题是,如果我只想填充集合,我什至需要做OPEN p_result FOR
。毕竟我没有从光标读取任何内容:
SELECT * FROM TABLE (CAST ( l_data AS Rpt_mapping_TableType));
应该够了。
没有?
【问题讨论】:
【参考方案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
经常被过度使用。除非您将数据传递给另一个程序,否则隐式游标和批量收集通常更简单、更快。
【讨论】:
以上是关于使用 SYS_REFCURSOR 填充 oracle 集合类型并关闭游标的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - pl sql 从 SYS_REFCURSOR 中选择
Oracle JDBC从过程中获取SYS_REFCURSOR
如何使用 out sys_refcursor 参数执行 oracle 过程?