我只是想知道在PL / SQL中使用嵌套或内部显式游标何时可行。使用JOINS可以始终避免这种情况吗?
任何以实用方式使用内部游标的例子都会很棒!
提前谢谢。
答案 0 :(得分:4)
如果你在谈论像
这样的结构FOR outer IN (<<query A>>)
LOOP
FOR inner IN (<<query B that depends on data from the outer query>>)
LOOP
<<do something>>
END LOOP;
END LOOP;
它本质上(即禁止优化器选择错误计划的一些极端情况,并且以任何其他方式修复它是不切实际的)总是更有效地组合两个查询并进行连接。 SQL引擎在确定如何连接两个表(或两个查询)方面具有更大的灵活性,并且比在PL / SQL引擎中编写的代码要好得多。
也就是说,如果您处理的是少量数据,而您(或维护系统的其他开发人员)在组合查询后会遇到问题,那么从可维护性的角度来看,可能有正当理由来编写代码循环。这个。例如,这可能是一种方法,来自其他语言的开发人员会更加熟悉阅读。如果数据量很小,手动编码嵌套循环连接的额外开销通常会相对较小,并且仍然可以产生可接受的代码。
就个人而言,我尽量避免使用这种构造,但我倾向于使用处理大量数据的系统,并且人们可以轻松编写正确的PL / SQL和正确的SQL以便查询连接将更具可读性。另一方面,如果你正在对一个小表进行一次性更新,那么编写一个快速块可以更快更容易地执行这种循环并将其交给其他人审查而不是必须验证加入两个大型查询不会发生任何意外情况。