Почему выражение connect by в цикле FOR выполняется только один раз?

Я только что нашел то, что я думаю, несколько неожиданное поведение в PLSQL vs SQL в Oracle.

Если я запускаю этот запрос на SQLDeveloper, я получаю 5 результатов:

select level lvl from dual connect by level <=5;

но если я запускаю этот оператор в SQLDeveloper:

declare
  w_counter number :=0;
begin
  for REC in (select level lvl from dual connect by level <=5)
  loop
    w_counter := w_counter+1;
  end loop;
  dbms_output.put_line('W_COUNTER: '|| w_counter);
end;

переменная w_counter заканчивается значением 1 (странно)

но самая странная часть заключается в том, что если я инкапсулирую запрос в подзапрос... что-то вроде:

declare
  w_counter number :=0;
begin
  for REC in (select * from (select level lvl from dual connect by level <=5))
  loop
    w_counter := w_counter+1;
  end loop;
  dbms_output.put_line('W_COUNTER: '|| w_counter);
end;

В w_counter переменная заканчивается значением 5...

что вы на это скажете?

Я использую Oracle 9.2 i

1 ответов


Это ошибка в версии Oracle 9i подтверждено до 9.2.0.8, но не за его пределами.

Это ранее обсуждалось на Спросить Тома ответ просто что "для sqlplus это".

поддержка Premier для Oracle 9.2 закончился 2007-07-31 и расширенная поддержка завершилась 2010-06-30. Чтобы исправить это, рекомендуется обновить до текущей версии Oracle; если не удается, необходимо исправить ваша база данных последней версии 9.2.0.8.