pl/sql打开游标问题
Posted
技术标签:
【中文标题】pl/sql打开游标问题【英文标题】:Pl/Sql open cursor problems 【发布时间】:2015-03-14 13:32:01 【问题描述】:我有类似的代码,
create or replace function ... return types.cursortype
as
l_cursor types.cursorType;
begin
open l_cursor for select ... ;
return l_cursor;
end;
此代码用于每天返回数百条记录。 这些打开的游标会导致任何内存泄漏问题吗?
有没有办法只在过程中关闭这些未关闭的游标?
有任何 SQL 来跟踪这种打开的游标吗?
如果重复请添加引用..
【问题讨论】:
去掉sql-server标签 【参考方案1】:这些打开的游标会导致任何内存泄漏问题吗?
如果你在使用后不让它们打开(对于explicit
游标),当打开游标时,oracle会创建一个context area,PL/SQL通过一个保存 SQL 语句返回的结果的游标。对于implicit
游标,无需担心
有没有办法只在程序中关闭这些未关闭的游标 ?
你可以,但不要,因为你打开它是为了在你真的不知道何时何地使用它以及使用需要多长时间的过程或函数之外使用它, 使用完毕后必须关闭光标。 (调用过程或函数时光标会打开)
任何用于跟踪此类打开游标的 SQL 吗?
有,可以查询v$sesstat
、v$statname
和v$session
的SYS视图:
select *
from v$sesstat ss, v$statname sn, v$session s
where ss.statistic# = sn.statistic# and s.sid=ss.sid
and sn.name = 'opened cursors current';
here有一篇关于监控游标的好文章。
【讨论】:
谢谢 :) 还有一件事,如果我将结果集返回给 java,如何关闭显式游标? 欢迎您,如果您通过 Java 在 PL/SQL 代码块中打开它,并且如果您使用过open cursor_name; ... ;
,那么请使用close cursor_name;
,如果您正在调用返回的函数或过程一个 ref 光标然后不用担心它们会在超出范围时关闭。以上是关于pl/sql打开游标问题的主要内容,如果未能解决你的问题,请参考以下文章