在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;
答案 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收集选项;)
如果这些链接最终破坏了......他的咒语"是:
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