Plsql 在PL/SQL中,隐式游标是否会关闭失败?

Plsql 在PL/SQL中,隐式游标是否会关闭失败?,plsql,cursor,implicit,Plsql,Cursor,Implicit,对于PL/SQL,是否会出现一种情况,比如在异常情况下,隐式游标无法关闭 我知道隐式游标应该在使用后自动关闭,但我只想知道是否存在这种情况,如果可能的话,什么样的补救措施将是一个好主意。当提交或回滚失败时,游标将不会自动关闭 使用光标时,建议使用以下路径: -- before using the cursor IF your_cursor %ISOPEN THEN CLOSE your_cursor; END IF; OPEN your_cursor;

对于PL/SQL,是否会出现一种情况,比如在异常情况下,隐式游标无法关闭


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

提交或回滚
失败时,游标将不会自动关闭
使用光标时,建议使用以下路径:

-- 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;

我假设你说的是隐式游标,也就是说,选择进入。。。或在PL/SQL块中执行的DML语句,而不是FOR循环

与显式游标一样,隐式游标具有属性;例如,您可以使用
SQL%NOTFOUND
(而不是
CURSOR\u NAME%NOTFOUND

引用
SQL%ISOPEN的on隐式游标属性:

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

我认为,这意味着无论是否引发异常,游标都将在执行后关闭。毕竟,由于异常而停止的执行仍然是一条已执行的SQL语句

原因已从中删除

SQL%ISOPEN的值始终为FALSE

它似乎已被添加到以下内容:

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

光标是否关闭并不重要,因为最后一个问题的答案是“什么样的补救措施将是一个好主意”。引用同一章:

不能控制隐式光标,但可以获取信息 从它的属性

因此,不可能。不可能进行补救;不可能显式关闭隐式打开的游标

您可能需要测试的一件事是,是否可以单独使用隐式游标来引发,因为这是我所能想到的最糟糕的结果。

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

从实用的角度来看——不管隐式游标是否可能保持打开状态,重要的问题是“您能对此做些什么?”。据我所知,这个问题的答案是“什么都没有”。您没有游标变量可以使用,没有办法(据我所知)访问隐式游标,因此您实际上无法影响它

您可以做两件事。第一件事是完全避免使用隐式游标。只使用显式游标,完成打开、获取、关闭等所有步骤。这将为您提供最大程度的控制。如果您喜欢这类事情,请尝试

另一方面,你可以使用隐式游标,不用担心。我很擅长不用担心。:-)不过,说真的,隐式游标比显式游标要好得多。要编写的代码更少,因此要出错的代码也更少。在某些情况下,系统可以优化隐式游标的使用,而无需编写一堆额外的代码。你写的代码更干净,更容易理解——如果你在一个人的商店里工作,在那里你写并维护所有的代码,这不是一个问题,但是在Corporateville这里,我们经常不得不写别人会维护的代码,反之亦然,我们尽可能地交出最干净、最清晰的代码,这被认为是礼貌的。有时(例如从Oracle外部将游标变量交还给调用方时)需要显式游标,但对于大多数代码,我使用隐式for-LOOP游标-,并且非常喜欢它!(对于那些能够回忆起的来源的人,还有额外的加分:-)


共享和享受。

因此,在这种情况下,如果提交或回滚失败,是否会引发异常?如果是这样,那么这样做是否更好:当其他人打开时异常,然后如果MyCursor%打开,然后关闭MyCursor;如果结束;但这是使用显式游标。OP讨论的是隐式游标(
用于foo_rec in(select*from foo)循环…
)。在这种情况下,没有游标变量,也没有办法用
%isopen
测试它。实际上有@a_horse_和_no_名称,您可以使用SQL%isopen(请参见我的答案),它总是返回false。如果您准确定义“隐式游标”的含义,可能会有所帮助。您是指使用SQL或DML的FOR循环吗?根据手册,您不能引用
SQL%ISOPEN
:“但是,由于select_语句不是独立语句,因此隐式游标是内部的-您不能使用SQL名称引用它。”