Oracle循环语句

PL/SQL有四种类型的循环:简单循环、WHILE循环、FOR循环以及游标FOR循环。在这里我们主要讨论前三种,除此之外,还将讨论Oracle 11g中新引入的CONTINUE语句。

一、 简单循环

       LOOP
             STATEMENT 1;
             STATEMENT 2;
             ...
             STATEMENT N;
        END LOOP;

        上述语句会无限制执行,因为没有语句指定何时可以终止循环。因此,简单循环称为无限循环。

        一般循环会有退出条件。退出条件有两种形式:EXIT 和 EXIT WHEN。l两者是等价的。语法分别如下:

        LOOP                                               LOOP 
              STATEMENT 1;                                  STATEMENT 1;
              STATEMENT 2;                                  STATEMENT 2;
              IF   CONDITION  THEN                        EXIT WHEN CONDITION;
                    EXIT;                                   END LOOP;
              END IF;
         END LOOP;

         如下所示:

复制代码
DECLARE
   v_counter BINARY_INTEGER := 0;
BEGIN
   LOOP
      v_counter := v_counter+1;
      DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
      IF v_counter = 5 THEN       -->> EXIT语句
         EXIT;
      END IF;
   END LOOP;
END; 
复制代码

 

复制代码
DECLARE
   v_counter BINARY_INTEGER := 0;
BEGIN
   LOOP
      v_counter := v_counter+1;
      DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
      EXIT WHEN v_counter = 5;        -->> EXIT WHEN语句
   END LOOP;
END;
复制代码

二、 WHILE循环

       WHILE循环的结构如下所示:

       WHILE CONDITION LOOP
              STATEMENT 1;
              STATEMNET 2;
              ...
              STATEMENT N;
        END LOOP;

        上例简单循环的例子可改写如下:

DECLARE
   v_counter BINARY_INTEGER := 0;
BEGIN
   WHILE v_counter < 5 LOOP
      v_counter := v_counter+1; 
      DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
   END LOOP;
END;

       在WHILE循环体中,同样可以使用EXIT和EXIT WHEN语句以提前终止循环

三、 整型值FOR循环

       其结构如下:

       FOR loop_counter IN [REVERSE] lower_limit..upper_limit LOOP
             STATEMENT 1;
             STATEMENT 2;
             ...
             STATEMENT N;
       END LOOP;

       变量loop_counter是隐含定义的索引变量。不需要在PL/SQL语句块的声明部分定义循环计数器。这个变量时循环结构定义的。lower_limit和upper_limit是两个整数数字或者在运行时计算结果为整数值的表达式,双点号(..)是范围操作符。如果使用IN REVERSE,则循环计数器会从upper_limit到lower_limit。

       上例简单循环的例子可改写如下:

BEGIN
FOR v_counter IN 1..5 LOOP
   DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
END LOOP;
END;

       上述讨论的EXIT和EXIT WHEN语句也可以在FOR循环的循环体中使用。

四、 CONTINUE语句

       CONTINUE语句有两种形式:CONTINUE和CONTINUE WHEN

       CONTINUE语法如下:

       IF CONTINUE_CONDITION THEN
           CONTINUE;
       END IF;

       CONTINUE WHEN语法如下:

       CONTINUE WHEN CONTINUE_CONDITION;

       二者等效。

       举例如下,求1到10内偶数的乘积。

复制代码
DECLARE
  v_sum number := 1;
BEGIN
  FOR i IN 1..10 LOOP
    IF MOD(i,2) != 0 THEN
      CONTINUE;
    END IF;
    v_sum := v_sum*i;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('The number is = '||v_sum);
END;
复制代码

五、嵌套循环

     我们已经讨论过三种类型的循环:简单循环、WHILE循环以及FOR循环。任何一种循环都可以嵌套在其他循环中。

     试举一例:

复制代码
DECLARE
  v_counter1 INTEGER :=0;
  v_counter2 INTEGER;
BEGIN
  WHILE v_counter1 < 3 LOOP
      DBMS_OUTPUT.PUT_LINE('v_counter1: '||v_counter1);
      v_counter2 := 0;
      LOOP
         DBMS_OUTPUT.PUT_LINE('v_counter2: '||v_counter2);
         v_counter2 := v_counter2+1;
         EXIT WHEN v_counter2 >= 2;
      END LOOP;
      v_counter1 := v_counter1+1;
  END LOOP;
END;
复制代码

 六、循环标签

       循环标签出现在循环的开始处,在循环语句的结尾处使用。在嵌套循环中,循环标签很有必要,因为这会大大提升代码的可读性。

       在某些场合,必须使用循环标签,如下例所示:     

复制代码
BEGIN
  <<outer>>
  FOR v_counter IN 1..3 LOOP
    <<inner>>
    FOR v_counter IN 1..2 LOOP
        DBMS_OUTPUT.PUT_LINE('outer.v_counter '||outer.v_counter);
        DBMS_OUTPUT.PUT_LINE('inner.v_counter '||inner.v_counter);
    END LOOP inner;
  END LOOP outer;
END;
复制代码

        在这里我们用了循环标签,因为内、外部循环都使用了相同的循环计数器v_counter。为了引用v_counter的内部直和外部值,就要使用循环标签。当然,循环标签的名称可任意取。

   

       

posted @   iVictor  阅读(4289)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示