隐式游标是否会在PL / SQL中无法关闭?

时间:2013-02-22 18:21:09

标签: plsql cursor implicit

使用PL / SQL会出现一种情况,例如在异常的情况下,隐式游标将无法关闭吗?

我知道隐式游标应该在使用后自行关闭,但只是想知道是否存在可能不是这种情况的情况,如果可能,那么什么样的补救将是一个好主意

3 个答案:

答案 0 :(得分:1)

COMMIT or ROLLBACK失败时,光标将自动关闭 建议在使用游标时使用下面的路径:

-- before using the cursor
    IF your_cursor %ISOPEN THEN
         CLOSE your_cursor;
    END IF;
   OPEN your_cursor;

-- after using the cursor
         CLOSE your_cursor;
-- when exception
    IF your_cursor %ISOPEN THEN
         CLOSE your_cursor;
    END IF;

答案 1 :(得分:1)

让我们将“隐式游标”定义为在FOR循环中执行的SELECT语句。

从实际的角度来看 - 无论是否可以将隐式光标保持打开,重要的问题是“你能做些什么呢?”。据我所知,这个问题的答案是“没什么”。你没有可以使用的游标变量,没有办法(我知道)访问隐式游标,因此你真的不能影响它。

你可以做两件事。首先是完全避免使用隐式游标。只使用显式游标,完成打开,抓取,关闭等所有步骤。这样可以获得最大程度的控制。如果你是这样的话,那就去吧。

另一方面,您可以使用隐式游标,只是不用担心。我很好,没有担心。 :-)严肃地说,隐式游标是IMO比明确游标好得多。编写代码的次数较少,因此编写的代码较少。在某些情况下,系统可以优化隐式游标的使用,而无需编写大量额外代码。您编写的代码更清晰,更容易理解 - 如果您在编写并维护所有代码的单人商店工作,则无需担心,但在Corporateville我们经常需要写其他代码将维护,反之亦然,我们可能会交出最干净,最清晰的代码。当有必要使用显式游标时,有时(例如将游标变量从Oracle外部传递给调用者),但对于大多数代码,我使用隐式FOR-LOOP游标 - LOVING ! (对于那些可以回想 来自哪里的人来说,还有额外的奖励积分: - )

分享并享受。

答案 2 :(得分:0)

我将假设您正在讨论隐式游标,即SELECT INTO ...或在PL / SQL块中执行的DML语句,而不是FOR循环。

与显式游标一样,隐式游标具有属性;您可以使用SQL%NOTFOUND(而不是CURSOR_NAME%NOTFOUND

引用SQL%ISOPEN {{1}}隐式游标属性的11.1 documentation

  

始终返回FALSE,因为数据库会关闭SQL游标   执行相关的SQL语句后自动执行。

我认为,这应该被认为是指游戏在执行后将被关闭,无论是否引发异常。毕竟,由于异常而暂停执行仍然是执行的SQL语句。

原因已从the 11.2 documentation中删除。

  

SQL%ISOPEN的值始终为FALSE。

它似乎已被添加到chapter on implicit cursors而不是:

  

SQL%ISOPEN始终返回FALSE,因为始终是隐式游标   在关联的语句运行后关闭。

由于对最终问题的回答,光标是否关闭并不重要,“什么样的修复将是一个好主意。”。引用同一章:

  

您无法控制隐式游标,但可以获取信息   从它的属性。

所以,不。没有可能的补救措施;不可能显式关闭隐式打开的游标。

您可能想要测试的一件事是,您是否可以仅使用隐式游标来提升ORA-0100: Maximum open cursors exceeded,因为这是我能想到的最糟糕的结果。