在 Oracle PL/SQL 存储过程中,并没有直接的 CONTINUE 语句来跳过当前循环迭代并继续下一次迭代,像在 C 或其他一些编程语言中那样。但是,你可以通过使用条件逻辑来模拟 CONTINUE 的行为。

通常,你会在 LOOP、WHILE LOOP 或 FOR LOOP 中使用 IF 语句来检查某个条件,并在满足条件时跳过循环体中剩余的代码。以下是如何在每种类型的循环中模拟 CONTINUE 的示例:

使用 LOOP 和 EXIT WHEN(没有直接的 CONTINUE,但可以通过条件逻辑跳过)


DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        i := i + 1;
 
        -- 模拟 CONTINUE 的条件
        IF i MOD 2 = 0 THEN
            -- 如果是偶数,则跳过剩余的代码
            CONTINUE_LABEL: -- 这是一个标签,实际上并不执行任何操作,只是用作标记
            GOTO AFTER_IF;  -- 跳转到 IF 语句之后的代码
        END IF;
 
        -- 这里的代码只会在 i 是奇数时执行
        DBMS_OUTPUT.PUT_LINE('i is odd: ' || i);
 
        <<AFTER_IF>> -- 这是 GOTO 语句跳转到的位置
 
        EXIT WHEN i >= 10; -- 退出循环的条件
    END LOOP;
END;
/

注意:上面的代码使用了 GOTO 语句,但通常不建议在 PL/SQL 中使用 GOTO,因为它会使代码难以理解和维护。这里只是为了说明如何通过标签和跳转来模拟 CONTINUE 的行为。在实际应用中,你应该避免使用这种方法。

更好的方法是重新组织代码,将不需要执行的代码块放在 IF 语句之外:


DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        i := i + 1;
 
        -- 如果 i 不是偶数(即奇数),则执行以下代码
        IF i MOD 2 != 0 THEN
            DBMS_OUTPUT.PUT_LINE('i is odd: ' || i);
        END IF;
 
        EXIT WHEN i >= 10; -- 退出循环的条件
    END LOOP;
END;
/

使用 WHILE LOOP


DECLARE
    i NUMBER := 0;
BEGIN
    WHILE i < 10 LOOP
        i := i + 1;
 
        -- 如果 i 是偶数,则跳过
        IF i MOD 2 = 0 THEN
            NULL; -- 不执行任何操作,相当于 CONTINUE
        ELSE
            DBMS_OUTPUT.PUT_LINE('i is odd: ' || i);
        END IF;
    END LOOP;
END;
/

在这个例子中,NULL 语句实际上不执行任何操作,它只是占位符。当 i 是偶数时,ELSE 部分的代码不会执行。

使用 FOR LOOP


BEGIN
    FOR i IN 1..10 LOOP
        -- 如果 i 是偶数,则跳过
        IF i MOD 2 = 0 THEN
            NULL; -- 不执行任何操作,相当于 CONTINUE
        ELSE
            DBMS_OUTPUT.PUT_LINE('i is odd: ' || i);
        END IF;
    END LOOP;
END;
/

同样地,NULL 语句在这里只是占位符。在 FOR LOOP 中,你不能修改循环变量 i 的值,因此你只能通过条件逻辑来控制是否执行循环体内的代码。

总的来说,你应该尽量避免在 PL/SQL 中使用像 GOTO 这样的跳转语句,而是应该通过重新组织代码逻辑来模拟 CONTINUE 的行为。

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐