Oracle 中的光标与 FOR 循环

Posted

技术标签:

【中文标题】Oracle 中的光标与 FOR 循环【英文标题】:Cursor vs FOR Loop in Oracle 【发布时间】:2018-08-22 20:27:32 【问题描述】:

所以我有一个 PLSQL 代码块,它将删除所有索引,如下面的代码块所示:

DECLARE
DRP_STMNT   VARCHAR2(100) := ''; 
BEGIN
    FOR I IN (SELECT INDEX_NAME FROM USER_INDEXES) LOOP
        DRP_STMNT := 'DROP INDEX ' || I.INDEX_NAME;
        EXECUTE IMMEDIATE DRP_STMNT;
    END LOOP;
END;
/

这将完成这项工作,但我应该使用游标而不是在 FOR LOOP 中嵌入我的 SELECT 语句吗?

FOR LOOP 是查看整个表还是一次处理一行?

你们建议使用什么,为什么?

【问题讨论】:

这里不需要使用显式游标。 @APC 如果我想将其创建为存储过程,情况是否相同? 当然。为什么不呢? 每个选择一个(隐式)游标。 【参考方案1】:

结果将是一样的。

不过,你会消耗更多的能量,因为你必须输入更多的字符,因为你必须声明一个游标和游标变量,打开一个游标,启动循环,从中获取,注意退出循环, 关闭光标。

当您使用游标 FOR 循环时(正如您所做的那样),键入的次数要少得多,因为 Oracle 为您做了很多。免费。

【讨论】:

但是我现在所拥有的是否会像我有一个光标(基本上一次指向每一行)一样执行? 无论哪种方式,你都会一个接一个地做,没有区别。 @Littlefoot 这并不完全正确;假设 plsql_optimize_level >=2,Oracle 可以并且将在幕后将 cursor for 循环转换为 fetch ... bulk collect limit 100 样式循环。对于 OP:无论光标是显式 (declare cursor some_curosr is ...; begin for rec in some_cursor loop ...) 还是隐式 for rec in (select ....) loop,循环的行为都是相同的。 啊!这是给高级用户的,@Boneist。不知道(显然,我不是那个高级人)。谢谢! @Littlefoot 每天都是学习日 *:-) 现在你是高级用户了,根据你的定义!

以上是关于Oracle 中的光标与 FOR 循环的主要内容,如果未能解决你的问题,请参考以下文章

Oracle / Toad 中的 For 循环

如何加快Oracle中的for循环?

存储过程中的 Oracle For 循环不循环

Oracle中的for和while循环

如何在for循环ORACLE中获取数组中的数组值

oracle 11g 中 for 循环中的 PL/SQL 限制