oracle 11g 中 for 循环中的 PL/SQL 限制
Posted
技术标签:
【中文标题】oracle 11g 中 for 循环中的 PL/SQL 限制【英文标题】:PL/SQL limitation in for-loops in oracle 11g 【发布时间】:2017-07-04 17:45:42 【问题描述】:我有一个大约有 3000 万条记录的表,我想像这样循环表中存在的记录:
for i in (select * from tbl_items it
Left join location lo
On lo.id=it.location_id) loop
// check some condition
// insert into log table
end loop ;
在 Oracle11g 的 PL/SQL 中的过程中的 for 循环是否有任何限制? 我认为它有限制,我怎么能跳过限制?
【问题讨论】:
这可能非常慢...... 不,没有限制(如果有那就太愚蠢了) @a_horse_with_no_name 我认为有一个限制,我尝试插入,我想在另一个表中插入数据,它只插入大约 100 万!! 但是为什么你认为这是一个 PL/SQL 循环限制?你得到了什么错误?循环中的逻辑是什么?是否真的有充分的理由使用 PL/SQL 而不是普通的 SQLinsert ... select
语句,这通常会更快、更高效?
循环是一个糟糕的选择。只需执行insert into target_table (col1, col2, col3) select c1, c2, c3 from source_table
,这将很多更快
【参考方案1】:
PL/SQL 对循环中的迭代次数没有任何实际限制。
我无法证明这一点,但这是我说没有限制的理由:
-
数据库 PL/SQL 语言参考的PL/SQL Program Limits 部分中没有列出任何限制。 Oracle 通常擅长的一件事是将硬限制保持在最低限度或始终有解决方法。
在编程语言中创建这样的限制没有意义。
多年前我开始专注于 Oracle SQL 和 PL/SQL 的一个原因是避免使用具有迭代限制的编程语言。很少有编程问题比“超出最大循环限制”之类的错误更令人沮丧。如果 PL/SQL 中存在这个问题,很多人会知道并对此感到愤怒。
在 some 点,每个循环都会终止 - 您将耗尽资源。但是对于像 PL/SQL 这样健全的语言,您可以更担心cosmic rays。
也许“限制”是指LIMIT
批量收集选项?如果是这样,Oracle 游标-FOR 循环使用 100 的限制。这意味着它将一次获取 100 行。这是内存和减少开销之间的一个很好的权衡,在实践中总是足够好的。
正如 a_horse_with_no_name 所建议的,完全避免循环是 Oracle SQL 中的最佳实践。基于集合的程序几乎总是比逐行更快。
【讨论】:
我在循环中有一些逻辑,所以我必须使用循环,并且从 3,4 表中加入循环中的选择 @MohammadMirzaeyan 没关系,它应该仍然有效。无论问题是什么,它都不是由某些 PL/SQL 循环限制引起的。您能否添加更多关于到底出了什么问题的信息? 我编辑了这个问题,问题是当我使用项目 ID 调用该过程时,它将被插入到日志表中,但是当我不将项目 ID 放在 where 子句中时,它不会插入它。 您的问题中没有“项目 ID”或“日志表”,所以我仍然不知道您遇到了什么问题。请添加simple example reproducing the issue。以上是关于oracle 11g 中 for 循环中的 PL/SQL 限制的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 PL/SQL 中的 for 循环没有打印出最后一次迭代
用于 oracle 11g 的 PL/SQL 中的嵌入式脚本 [重复]
读取 XML 格式的字符串并使用 PL SQL 中的 for 循环进行更新
pl sql select * from owner.view1 减去 select * from owner2.view1 作为 for 循环中的游标