【问题标题】:what is the default value of %NOTFOUND in cusor attribute?cusor 属性中 %NOTFOUND 的默认值是多少?
【发布时间】:2012-06-30 05:33:44
【问题描述】:

我正在研究 PL/SQL 游标。我的光标属性有问题。 %FOUND%NOTFOUND 在隐式和显式游标中的默认值是多少?

我在翻PDF时发现了这句话

LOOP
FETCH c1 INTO my_ename, my_sal, my_hiredate;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;

在第一次提取之前,%NOTFOUND 的计算结果为 NULL。 因此,如果 FETCH 从未成功执行,则永远不会退出循环。这是因为 EXIT WHEN 语句仅在其 WHEN 条件为 真的。为安全起见,请改用以下 EXIT 语句:

EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;

如果游标未打开,使用%NOTFOUND 引用它会引发INVALID_CURSOR

【问题讨论】:

    标签: sql plsql attributes cursor


    【解决方案1】:

    在回答您的问题时,没有“默认”值。 %NOTFOUND 是一个“变量”,在打开游标时被实例化。那时的值为空;我想如果你愿意的话,你可以把它称为默认值。在第一次获取游标后,该值将是 true 还是 false,具体取决于是否返回了任何行。光标关闭后,“变量”不再存在。

    引用11gr2 documentation

    %NOTFOUND(%FOUND 的逻辑反义词)返回:
    在显式游标打开之后但在第一次提取之前为 NULL
    如果从显式游标的最新提取返回一行,则为 FALSE
    否则为真

    10g documentation has a useful table that demonstrates this

    +----------------+--------+--------------+ |舞台 |什么时候 |返回值 | +----------------+--------+--------------+ |开放|之前 |例外 | | |之后 |空 | |第一次提取 |之前 |空 | | |之后 |假 | |下一次提取 |之前 |假 | | |之后 |假 | |最后一次取货 |之前 |假 | | |之后 |真实 | |关闭 |之前 |真实 | | |之后 |例外 | +----------------+--------+--------------+

    但是,Oracle 文档中似乎存在直接矛盾。 11g 文档也有类似于您所描述的内容。其措辞似乎与上述断言直接矛盾

    注意:在示例 6-16 中,如果 FETCH 从不获取行,则 c1%NOTFOUND 始终为 NULL,并且永远不会退出循环。防止无限 循环,请改用此 EXIT 语句:EXIT WHEN c1%NOTFOUND OR (c1%NOTFOUND IS NULL);

    10g documentation 更加明确且措辞略有不同。这不是直接矛盾

    在第一次提取之前,%NOTFOUND 的计算结果为 NULL。如果 FETCH 从不 成功执行,EXIT WHEN 条件永远不会为 TRUE,并且 循环永远不会退出。为了安全起见,您可能需要使用以下内容 改为 EXIT 语句:

    当 c1%NOTFOUND 或 c1%NOTFOUND 为 NULL 时退出;

    总的来说,我会说相信文档并写EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL是明智之举。

    我不知道在什么情况下 fetch 不会成功执行; I've asked the question。如果由于锁定等原因 fetch 永远不会返回值,那么您将永远无法到达代码部分来确定它是否失败。

    René Nyffenegger 在他的博客上有一些代码很好地解释了%NOTFOUND 的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 2022-11-11
      • 1970-01-01
      • 2021-09-20
      • 2016-01-17
      • 2017-08-30
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多