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$sesstatv$statnamev$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打开游标问题的主要内容,如果未能解决你的问题,请参考以下文章

Pl/Sql 在for循环中打开游标

PL/SQL:clob 字符串中的动态查询。如何打开游标?

在 PL/SQL 过程中打开动态表名的游标

从 pl/sql 异常块中“一次”关闭所有游标

pl/sql 游标

PL/SQL编程_游标