获取后,%NOTFOUND可以返回null吗?

Ben*_*Ben 9 oracle plsql cursor

这个问题提出了一个非常有趣的观点 在Oracle文档中似乎存在一个矛盾,即%NOTFOUND在获取后是否可能为null.是吗?

引用11g文档

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

文档似乎直接与自身相矛盾,因为它也说明了以下内容,这意味着在获取后%NOTFOUND 不能为空.

%NOTFOUND(%FOUND的逻辑反向)返回:
在显式游标打开之后但在第一次获取之前返回NULL
如果最近从显式游标获取的行返回一行
TRUE,否则返回FALSE

10克文件也有类似的警告,因为它警告说,可能会取不为了成功执行这种行为将要展出这不是必然,直接的矛盾.

在第一次获取之前,%NOTFOUND计算为NULL.如果FETCH永远不会成功执行,则EXIT WHEN条件永远不会为TRUE,并且永远不会退出循环.为安全起见,您可能希望使用以下EXIT语句:

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

在什么情况下,获取"失败"或者%NOTFOUND在执行获取后可能返回null?

A.B*_*ade 7

我可以找到一个获取失败的情况:

declare
  i integer;
  cursor c is
    select 1 / 0 from dual;
begin
  open c;

  begin
    fetch c
      into i;
  exception
    when others then
      dbms_output.put_line('ex');
  end;

  if c%notfound is null then
    dbms_output.put_line('null');
  elsif c%notfound then
    dbms_output.put_line('true');
  else
    dbms_output.put_line('false');
  end if;
  close c;

end;
Run Code Online (Sandbox Code Playgroud)

但这只会使你的问题变得更强,因为无论是10g还是11g,它都会被评估为null.


Ada*_*kes 0

我认为让你绊倒的部分是:

如果 FETCH 从未成功执行,则 EXIT WHEN 条件永远不会为 TRUE,并且永远不会退出循环。

过去的某个地方一定有一个代码示例,如下所示:

LOOP
  FETCH c1 INTO name;
  EXIT WHEN c1%NOTFOUND;
  -- Do stuff
END LOOP;
Run Code Online (Sandbox Code Playgroud)

给出这段代码,那么这个说法听起来是正确的。如果提取从未执行(失败),则 %NOTFOUND 将为 null。该EXIT WHEN条件不会评估为 TRUE(null 评估为 false)。那么,事实上,循环将永远持续下去。