Skip to main content

循环

在 PL/SQL(Procedural Language for SQL)中,循环结构用于重复执行一段代码块。PL/SQL 提供了多种类型的循环,以满足不同的需求。以下是常见的三种循环类型及其用法:


1. 基本 LOOP 循环

这是最简单的循环结构,没有明确的终止条件,必须通过 EXITRETURN 语句来退出循环。

语法

LOOP
-- 循环体
EXIT WHEN 条件;
END LOOP;

示例

DECLARE
v_counter NUMBER := 1; -- 初始化计数器
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('当前值: ' || v_counter);
v_counter := v_counter + 1; -- 更新计数器
EXIT WHEN v_counter > 5; -- 当计数器大于 5 时退出循环
END LOOP;
END;
/

输出:

当前值: 1
当前值: 2
当前值: 3
当前值: 4
当前值: 5

2. WHILE 循环

WHILE 循环根据指定的条件来决定是否继续执行循环体。如果条件为 TRUE,则执行循环;否则退出循环。

语法

WHILE 条件 LOOP
-- 循环体
END LOOP;

示例

DECLARE
v_counter NUMBER := 1; -- 初始化计数器
BEGIN
WHILE v_counter <= 5 LOOP
DBMS_OUTPUT.PUT_LINE('当前值: ' || v_counter);
v_counter := v_counter + 1; -- 更新计数器
END LOOP;
END;
/

输出:

当前值: 1
当前值: 2
当前值: 3
当前值: 4
当前值: 5

3. FOR 循环

FOR 循环是一种带有明确范围的循环,通常用于迭代固定次数的操作。它会自动初始化、递增和终止计数器。

语法

FOR 循环变量 IN [REVERSE] 起始值 .. 结束值 LOOP
-- 循环体
END LOOP;
  • REVERSE:可选关键字,用于反向迭代(从大到小)。
  • 起始值结束值:定义循环的范围。

示例 1:正向迭代

BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('当前值: ' || i);
END LOOP;
END;
/

输出:

当前值: 1
当前值: 2
当前值: 3
当前值: 4
当前值: 5

示例 2:反向迭代

BEGIN
FOR i IN REVERSE 5..1 LOOP
DBMS_OUTPUT.PUT_LINE('当前值: ' || i);
END LOOP;
END;
/

输出:

当前值: 5
当前值: 4
当前值: 3
当前值: 2
当前值: 1

4. 嵌套循环

可以在一个循环内部嵌套另一个循环,用于处理更复杂的逻辑。

示例

BEGIN
FOR i IN 1..3 LOOP
FOR j IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE('i=' || i || ', j=' || j);
END LOOP;
END LOOP;
END;
/

输出:

i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
i=3, j=1
i=3, j=2
i=3, j=3

5. 使用 CONTINUE 跳过当前迭代

从 Oracle 12c 开始,PL/SQL 引入了 CONTINUE 语句,用于跳过当前循环的剩余部分并直接进入下一次迭代。

示例

BEGIN
FOR i IN 1..5 LOOP
IF MOD(i, 2) = 0 THEN
CONTINUE; -- 跳过偶数
END IF;
DBMS_OUTPUT.PUT_LINE('当前值: ' || i);
END LOOP;
END;
/

输出:

当前值: 1
当前值: 3
当前值: 5

6. 总结对比

循环类型特点
基本 LOOP最灵活,但需要手动控制退出条件 (EXIT)。
WHILE 循环根据条件决定是否继续执行,适合不确定循环次数的场景。
FOR 循环固定范围的迭代,适合已知循环次数的场景,且自动管理计数器。
嵌套循环用于多层迭代,适用于复杂逻辑。
CONTINUE跳过当前迭代,简化逻辑(从 Oracle 12c 开始支持)。

根据具体需求选择合适的循环类型,可以提高代码的可读性和效率。