Почему соединение через выражение в цикле 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

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

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

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