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

时间:2014-04-02 15:02:45

标签: sql oracle plsql oracle9i

我刚刚发现了我认为在Oracle中PLSQL vs SQL中的一些意外行为。

如果我在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

1 个答案:

答案 0 :(得分:6)

在Oracle 9i It's a bug版本中

confirmed up to 9.2.0.8,但不能超越。

之前在Ask Tom上进行过讨论,回复只是“sqlplus执行”

对Oracle 9.2 ended on 2007-07-31的高级支持和扩展支持在2010-06-30结束。要解决此问题,建议您升级到当前版本的Oracle;如果不能,则应该将数据库修补为9.2.0.8版本。