如果我打开了一个游标却忘记了将其关闭,那么该游标在Oracle中将存在多长时间?
是否有一些设置可以配置游标的生存期?
最佳答案
以及DCookie的答案:
游标生命周期的一般模式是
OPEN
BIND
EXECUTE
FETCH...FETCH...FETCH
BIND
EXECUTE
FETCH...FETCH...FETCH
...
CLOSE
也就是说,可以通过将游标绑定(bind)到游标并重新执行游标来重新使用游标。
PL/SQL还将在 session 级别维护cache of cursors,以避免重新打开您最近关闭的游标的开销。因此,以编程方式关闭的游标可能仍处于打开状态。 Oracle将在适当的时候将它们关闭。
如果游标超出范围,则可以将其关闭。也就是说,如果调用或过程类似于:
DECLARE
CURSOR c_1 IS SELECT ....;
BEGIN
OPEN c_1;
FETCH c_1 INTO...;
END;
然后,一旦完成执行,c_1就会超出范围(并且无法再次物理调用)并且可以关闭。这对于异常处理特别有用,因为有可能引发异常,跳出过程并绕过所有“CLOSE c_1;”。代码。通过关闭范围外的游标,您不必担心添加异常处理代码来做到这一点。
如果您的游标具有 session 范围(例如,在PL/SQL包规范或主体的全局级别中定义,或通过ref游标返回给客户端),则它永远不会超出范围,因此,在关闭之前,它不会自动关闭 session 断开连接或通过DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES)进行连接;