2010-06-07 51 views

回答

2

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

您可以通过关闭它,当你用它做;-)

严重的是,依靠一些设置来关闭游标你只是隐藏的问题并促进惰性编程配置光标的寿命。它也可能对合法需要保持光标更长时间打开的任何过程产生不利影响。

3

除了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);

+0

+1好信息,谢谢加里。 – DCookie 2010-06-08 14:38:56