Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can %NOTFOUND return null after a fetch?

This question raised a very interesting point; there seems to be a contradiction in the Oracle documentation on whether it's possible for %NOTFOUND to be null after a fetch. Is it?

To quote from the 11g documentation

Note: In Example 6-16, if FETCH never fetches a row, then c1%NOTFOUND is always NULL and the loop is never exited. To prevent infinite looping, use this EXIT statement instead: EXIT WHEN c1%NOTFOUND OR (c1%NOTFOUND IS NULL);

The documentation seems to directly contradict itself as it also says the following, which implies that after a fetch %NOTFOUND cannot be null.

%NOTFOUND (the logical opposite of %FOUND) returns:
NULL after the explicit cursor is opened but before the first fetch
FALSE if the most recent fetch from the explicit cursor returned a row
TRUE otherwise

The 10g documentation has a similar warning, which isn't, necessarily, a direct contradiction as it warns that a fetch might not execute successfully in order for this behaviour to be exhibited.

Before the first fetch, %NOTFOUND evaluates to NULL. If FETCH never executes successfully, the EXIT WHEN condition is never TRUE and the loop is never exited. To be safe, you might want to use the following EXIT statement instead:

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

In what situations might a fetch either "fail" or might %NOTFOUND return null after a fetch has been executed?

like image 325
Ben Avatar asked Jun 30 '12 09:06

Ben


People also ask

What is the value of %Notfound attributes when it is used inside the cursor null true Invalid_cursor all of them?

Before the first fetch, %NOTFOUND evaluates to NULL. EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL; If a cursor is not open, referencing it with %NOTFOUND raises INVALID_CURSOR .

What happens when rows are not found using a fetch statement?

If the fetch never executes (fails), then %NOTFOUND will be null. The EXIT WHEN condition will not evaluate to TRUE (null evaluates to false). Then, indeed, the loop will continue forever.

What happens when row are found using a fetch statement?

The FETCH statement retrieves rows of data from the result set of a multiple-row query—one row at a time, several rows at a time, or all rows at once—and stores the data in variables, records, or collections.

Which of the following cursor attribute returns true if the cursor is open?

The %ISOPEN attribute returns TRUE if the cursor is open; otherwise, it returns FALSE. In most cases when you use a cursor, you open it, fetch from it, and close it, all within one routine.


1 Answers

I can find a situation where a fetch can fail:

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;

But this only makes your question stronger since it will evaluate to null, neither in 10g nor in 11g ...

like image 142
A.B.Cade Avatar answered Sep 30 '22 04:09

A.B.Cade