为什么在FOR循环中通过表达式连接,只执行一次?

JGS*_*JGS 21 sql oracle plsql oracle9i

我刚刚发现了我认为在Oracle中PLSQL vs SQL中有些出乎意料的行为.

如果我在SQLDeveloper上运行此查询,我得到5个结果:

select level lvl from dual connect by level <=5;
Run Code Online (Sandbox Code Playgroud)

但是,如果我在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;
Run Code Online (Sandbox Code Playgroud)

变量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;
Run Code Online (Sandbox Code Playgroud)

w_counter变量完成与价值5 ...

你有什么要对此说的?

我使用的是Oracle 9.2i

Jon*_*ler 6

是Oracle 9i版本中的一个错误,确认高达9.2.0.8,但不是超出.

之前在Ask Tom上讨论过,响应只是"sqlplus这样做".

对Oracle 9.2的高级支持在2007-07-31结束,扩展支持在2010-06-30结束.要解决此问题,建议您升级到当前版本的Oracle; 如果无法,则应修补数据库的版本9.2.0.8.

  • 如果您不喜欢这个答案,请**编辑**.这就是为什么它是一个社区维基.所有评论都基本上都是"这是一个错误".这个问题值得回答,即使它不是一个很好的问题.没有人想要阅读所有这些评论.我从[this thread](http://meta.stackoverflow.com/q/251597/409172)得到了这个想法. (7认同)
  • @GuidoLeenders我看了但找不到bug号.我添加了这个答案来总结评论,以防没有提供更好的答案.我把它标记为社区维基,所以我不会重复任何其他人所说的点. (6认同)