【问题标题】:Lifetime of a cursor in OracleOracle中游标的生命周期
【发布时间】:2010-06-07 17:02:15
【问题描述】:

如果我打开一个游标忘记关闭它,该游标在 Oracle 中会存在多久?

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

【问题讨论】:

    标签: oracle database-cursor


    【解决方案1】:

    以及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);

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2014-09-10
        • 2013-04-06
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多