Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么FOR循环中的connectby表达式只执行一次?_Sql_Oracle_Plsql_Oracle9i - Fatal编程技术网

Sql 为什么FOR循环中的connectby表达式只执行一次?

Sql 为什么FOR循环中的connectby表达式只执行一次?,sql,oracle,plsql,oracle9i,Sql,Oracle,Plsql,Oracle9i,我刚刚发现了我认为PLSQL与Oracle中的SQL之间有点出乎意料的行为 如果我在SQLDeveloper上运行此查询,我会得到5个结果: select level lvl from dual connect by level <=5; 在Oracle 9i版本中,从dual connect by level中选择级别lvl,但不能超过此级别 前面已经讨论过了,答案只是“sqlplus可以做到这一点” 对Oracle 9.2的卓越支持和扩展支持于2010年6月30日结束。要解决此问题,

我刚刚发现了我认为PLSQL与Oracle中的SQL之间有点出乎意料的行为

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

select level lvl from dual connect by level <=5;
在Oracle 9i版本中,从dual connect by level中选择级别lvl,但不能超过此级别

前面已经讨论过了,答案只是“sqlplus可以做到这一点”


对Oracle 9.2的卓越支持和扩展支持于2010年6月30日结束。要解决此问题,建议您升级到Oracle的当前版本;如果无法,则应将数据库修补到超过9.2.0.8版。

我在Oracle 11g中获得了两个块的
5
。不幸的是我没有9i!听起来像是一个优化器错误。。。。您可以尝试在不进行任何优化的情况下运行PL/SQL吗?我猜优化器看到select from dual,推断select from dual只返回一行,并将循环剥离到单个调用。。。只是胡乱猜测;-)两个街区我都得5分。我使用的是Oracle 10G。如果我在9.2.0.7.0上尝试这个,我会看到与您相同的结果。这是一个bug。对9.2的卓越支持于2007年到期,在更高版本中已修复。你真的应该考虑升级你的服务器-我们在11gR2上,我认为我们落后于时代了…很抱歉,我认为你需要登录到Oracle支持以查看我在下面发布的链接请参见asktom.Oracle.com上的此帖子。Tom Kyte在其他线程上解释说9i和10g之间存在优化器差异。您可以添加错误号吗?根据前面的评论,这是一个bug是相当明显的。@Guidolenders我看了一下,但找不到bug编号。我添加这个答案是为了总结评论,以防没有更好的答案。我把它标记为社区维基,这样我就不会因为重复别人说的话而得到任何分数。@jonearles:那就不要把它作为答案发布。这应该是一个评论。如果你不喜欢这个答案,请编辑它。这就是为什么它是一个社区维基。所有的评论基本上都在说“这是一个bug”。这个问题值得回答,即使不是一个很好的问题。没有人愿意通读所有这些评论。这个主意是我从你那里得到的。
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;
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;