在Oracle PL/SQL中,FOR循环的基本语法是:FOR 循环变量 IN 下限..上限 LOOP 循环体; END LOOP; 例如:
DECLARE
BEGIN
FOR i IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('i=' || i);
END LOOP;
END;
这是最简单的数值FOR循环,直接从下限循环到上限,自动处理增量。
来源1
FOR循环有两种形式:数值FOR循环和游标FOR循环。数值FOR循环格式为FOR 循环索引 IN [REVERSE] 下限..上限 LOOP语句序列END LOOP; 其中下限和上限必须是可求值的整数表达式,不能省略。REVERSE表示倒序循环,从上限循环到下限,步长为-1。正序步长为1。循环索引隐式定义为%TYPE类型,初始值为下限,最后值为上限(不一定执行),在循环体内可读可写,但不能赋值。
来源2
掌握技巧:1.使用REVERSE时注意步长变化;2.下限大于上限时,正序不执行,反序执行;3.循环变量不可在外部声明,作用域仅循环内;4.结合EXIT/WHEN提前结束;5.嵌套FOR循环时注意变量名冲突。示例:FOR i IN REVERSE 1..5 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; 输出5到1。
来源3
游标FOR循环:FOR 循环索引 IN (光标名|光标SELECT语句) LOOP ... END LOOP; 自动打开游标、循环取值、关闭游标。示例:FOR emp_rec IN (SELECT * FROM emp) LOOP DBMS_OUTPUT.PUT_LINE(emp_rec.ename); END LOOP; 技巧:隐式游标管理省代码,但复杂查询用显式游标控制更好。
来源4
编写技巧:FOR循环效率高,避免WHILE显式计数;用标签处理嵌套退出,如<
来源5
实际案例:批量更新FOR i IN 1..100 LOOP UPDATE table SET col=val WHERE id=i; END LOOP; COMMIT; 但推荐用BULK COLLECT优化大循环。掌握:从小循环练手,逐步加REVERSE、游标、条件判断,模拟业务场景如报表生成。
来源6
常见错误:修改循环变量值无效,因为每次迭代重新赋值;下限上限非整数报错;忘记END LOOP。技巧:用DBMS_OUTPUT验证循环次数;用%ROWCOUNT检查游标记录数。
FAQ
Q: FOR循环和WHILE区别?
A: FOR自动管理计数,适合固定范围;WHILE灵活但需手动控制。
Q: 怎么跳过循环?
A: 用CONTINUE; 但Oracle 11g前无,继续用IF跳过。
Q: 步长自定义?
A: 数值FOR固定步长1或-1,自定义用WHILE。
Q: 游标FOR支持参数?
A: 是,直接传参到SELECT。