我有一个大约有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"或"日志表",因此我仍然不知道您遇到了什么问题。 请添加一个简单的示例来重现该问题。