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 循环的主要内容,如果未能解决你的问题,请参考以下文章