7

If I open a cursor and forget to close it, for how long will the cursor exist in Oracle?

Are there some settings to configure the lifetime of the cursor?

4

2 回答 2

4

以及 DCookie 的回答:

游标生存期的一般模式是

OPEN 
BIND
EXECUTE
FETCH...FETCH...FETCH
BIND
EXECUTE
FETCH...FETCH...FETCH
...
CLOSE

也就是说,可以通过将新变量绑定到游标并重新执行它来重新使用游标。

PL/SQL 还将在会话级别维护游标缓存,以避免重新打开您最近关闭的游标的开销。因此,您以编程方式关闭的游标可能仍处于打开状态。Oracle 将在适当的时候在幕后关闭它们。

如果游标超出范围,则可以将其关闭。也就是说,如果一个调用或过程是这样的:

DECLARE
  CURSOR c_1 IS SELECT ....;
BEGIN
  OPEN c_1;
  FETCH c_1 INTO...;
END;

然后一旦它完成执行, c_1 就会超出范围(并且不能再次物理调用)并且可以关闭。这对于异常处理特别有用,因为有可能引发异常,跳出过程并绕过所有'CLOSE c_1;' 代码。通过关闭超出范围的游标,您不必担心添加异常处理代码来执行此操作。

如果您的游标具有会话范围(例如,在 PL/SQL 包规范或主体的全局级别中定义或通过引用游标返回给客户端)它永远不会以这种方式超出范围,因此永远不会自动关闭,直到会话断开连接或通过 DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES);

于 2010-06-07T23:12:15.533 回答
2

我相信它会一直存在,直到您的会话消失或关闭为止。

您可以通过在完成后关闭光标来配置光标的生命周期;-)

说真的,依靠某些设置为您关闭游标只会隐藏问题并促进惰性编程。它还可能对任何合法需要保持游标打开更长一段时间的进程产生不利影响。

于 2010-06-07T20:43:48.363 回答