for循环语句的效率

时间:2015-04-27 14:52:23

标签: plsql

在pl / sql中,可以这样做:

begin

  for i in (select colname from table)
  loop
     dbms_output.put_line(i.colname);
  end loop;

end;

将遍历循环声明中sql查询生成的结果集。但是,这效率低吗?这会导致SQL在每次迭代时执行吗?如果是这样,以下问题是否解决了这个问题?

declare

TYPE name_typ IS TABLE OF VARCHAR2(128);
all_names name_typ;

begin

  select col_name BULK COLLECT INTO all_names from mytable;

  for i in 1..all_names.count
  loop
    dbms_output.put_line(all_names(i));
  end loop;

end;

1 个答案:

答案 0 :(得分:2)

1) Is this inefficient?

排序。与直接SQL相比效率低......如果你能在SQL中做到这一点,那就不要用PL / SQL做。    也就是说,你所拥有的光标结构是合理的,而且效率很高。"因为它得到了(除非你稍后进入BULK收集)

2) Does this result in the SQL being executed on every iteration?

没有。它是一个光标,它会激活一次,然后继续轮询结果。

3) If so, does the following solve the issue?

它并没有真正改变任何关于QUERY的东西...... BULK收集只是在改进行的检索方面。

而不是检索1行并说"好吧......得到它" ..它一次抓20,50或100 ..然后转向客户"得到它们!"

所以在这方面,BULK收集更有效率。

同样,我会说:如果你可以在SQL中这样做,那么就这样做。 :) SQL几乎总是胜过PL / SQL ...... BULK收集与否..

这是Tom Kyte关于这个主题(和其他人)的一篇很好的文章;) (虽然他没有在这篇特别的文章中提到BULK收集)

Tom Kyte article on SQL, cursors, etc.

他重复了他的咒语"在这里,通过BULK收集选项;)

Tom's mantra

如果这些链接最终破坏了......他的咒语"是:

o You should do it in a single SQL statement if at all possible. 
o If you cannot do it in a single SQL Statement, then do it in PL/SQL. 
o If you cannot do it in PL/SQL, try a Java Stored Procedure. 
o If you cannot do it in Java, do it in a C external procedure. 
o If you cannot do it in a C external routine, you might want to seriously think about why it is you need to do it