我有代码,
create or replace function ... return types.cursortype
as
l_cursor types.cursorType;
begin
open l_cursor for select ... ;
return l_cursor;
end;
此代码用于每天返回数百条记录。 这些打开的游标是否会导致任何内存泄漏问题?
有没有办法在程序中关闭这些未关闭的游标?
用于跟踪此类打开游标的任何SQL?
如果重复,请添加参考文献..
答案 0 :(得分: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有一篇关于监控游标的好文章。