使用PL / SQL会出现一种情况,例如在异常的情况下,隐式游标将无法关闭吗?
我知道隐式游标应该在使用后自行关闭,但只是想知道是否存在可能不是这种情况的情况,如果可能,那么什么样的补救将是一个好主意
答案 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,因为这是我能想到的最糟糕的结果。