我有一个大约有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我认为有一个限制,我尝试插入,我想在另一个表中插入数据,它只插入约一百万!

但是,为什么您认为那是PL / SQL循环限制呢? 您遇到什么错误? 循环内部有什么逻辑? 使用PL / SQL代替普通的SQL insert ... select语句(通常会更快,更高效)是否真的有充分的理由?

循环是一个糟糕的选择。 只需做一个insert into target_table (col1, col2, col3) select c1, c2, c3 from source_table,它将更快

PL / SQL对循环中的迭代次数没有任何实际限制。

我无法证明这一点,但这是我说没有限制的原因:

在数据库PL / SQL语言参考的PL / SQL程序限制部分中未列出任何限制。 Oracle通常擅长的一件事是将硬限制保持在最低限度,或者始终采用解决方法。

用编程语言创建这样的限制没有意义。

多年前我开始专注于Oracle SQL和PL / SQL的原因之一是避免使用一种具有迭代限制的编程语言。很少有编程问题比"超出最大循环限制"之类的错误更令人沮丧。如果PL / SQL中存在此问题,很多人都会对此感到愤怒。

在某些时候,每个循环都会消失-您将耗尽资源。但是对于像PL / SQL这样的理智的语言,您可以更担心宇宙射线。

也许"限制"是指LIMIT批量收集选项?如果是这样,Oracle cursor-FOR循环的限制为100。这意味着它将一次获取100行。这是内存与减少开销之间的一个很好的折衷,实际上总是足够的。

正如a_horse_with_no_name所建议的那样,完全避免循环是Oracle SQL中的最佳实践。基于集合的程序几乎总是比逐行更快。

我在循环中有一些逻辑,所以我必须使用循环,并且循环中的select从3,4表联接

@MohammadMirzaeyan很好,它仍然可以正常工作。 无论是什么问题,它都不是由某些PL / SQL循环限制引起的。 您能否添加一些有关到底出了什么问题的详细信息?

我编辑问题,问题是当我调用带有项目ID的过程时,它将插入到日志表中,但是当我不将项目ID放在where子句中时,它将不会插入它。

您的问题中没有"项目ID"或"日志表",因此我仍然不知道您遇到了什么问题。 请添加一个简单的示例来重现该问题。