Подтвердить что ты не робот

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

Я только что нашел, что, по моему мнению, несколько неожиданное поведение в PLSQL и 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.2i

4b9b3361

Ответ 1

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

Ранее обсуждалось в Ask Tom, ответ просто заключался в том, что "sqlplus делает это".

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