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 而不是普通的 SQL insert ... 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 限制的主要内容,如果未能解决你的问题,请参考以下文章

用于 oracle 11g 的 PL/SQL 中的嵌入式脚本 [重复]

oracle pl/sql中的循环及if语句

PL/SQL Oracle 11g 记录组

从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g

PL/SQL developer连接oracle11g2

Oracle / Toad 中的 For 循环