Oracle中游标的生命周期

时间:2010-06-07 17:02:16

标签: oracle cursor

如果我打开游标并忘记关闭它,那么游标在Oracle中存在多长时间?

是否有一些设置来配置光标的生命周期?

2 个答案:

答案 0 :(得分:4)

和DCookie的答案一样:

游标生存期的一般模式是

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

这是一个游标,可以通过将新变量绑定到它并重新执行它来重复使用。

PL / SQL还将在会话级别维护cache of cursors,以避免重新打开最近关闭的游标的开销。因此,以编程方式关闭的光标可能仍处于打开状态。 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);

答案 1 :(得分:2)

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

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

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