欢迎投稿

今日深度:

Oracle数据库中的循环语法及举例,

Oracle数据库中的循环语法及举例,


目录
  • 前言
  • 一、简单循环
    • 1.1LOOP 循环语法:
    • 1.2LOOP 循环示例
  • 二、for循环
    • 2.1for循环语法:
    • 2.2for循环示例
  • 三、while循环
    • 3.1while循环语法
    • 3.2while循环示例
  • 四、GOTO 循环
    • 4.1GOTO 循环语法
    • 4.2GOTO 循环示例
  • 总结 

    前言

    在 Oracle 数据库中,提供了多种循环类型用于实现不同的业务逻辑需求。我们可以使用 PL/SQL 中的循环语句来实现反复执行一段代码块的目的。PL/SQL 是一种过程化语言,提供了完善的控制流结构,支持多种循环形式。下面介绍一些常用的循环语句及其语法和示例。

    一、简单循环

    之所以会被叫做简单循环:因为它仅是以LOOP关键字开始,以END LOOP语句结束。要靠循环体内的EXIT、EXIT WHEN或者RETURN来退出循环(或者有异常抛出)。这种循环为LOOP 循环,是一种无限循环,它会反复执行一个语句块,直到遇到 BREAK 语句为止。LOOP 循环在程序中也通常用于等待某个条件变为真时再退出循环,或者在处理数据集合时用来查找某个特定的记录。

    1.1LOOP 循环语法:

    LOOP 循环的语法如下:

    LOOP
        -- statements to be executed
        EXIT [WHEN condition];
    END LOOP;
    --简单理解为:
    loop
      要执行的语句;        ┐
      exit when 退出条件;  ├循环体
      [要执行的语句;]      ┘
    end loop;

    EXIT 是一个可选关键字,可以用来指定跳出循环的条件; condition 是一个布尔表达式,当其值为 TRUE 时会导致循环退出。

    1.2LOOP 循环示例

    下面就是使用 LOOP 循环的一些示例 

    示例1.循环打印1-10,代码如下:

    declare
    v1 number:=0;
    begin
      loop
        v1:=v1+1;
        dbms_output.put_line(v1);
        exit when v1=10;
    end loop;
    end;

    输出结果如下:

    示例2.循环打印1-10的和,代码如下:

    declare
    v1 number:=1;--自增
    v2 number:=0;--求和
    begin
      loop
        v2:=v2+v1;
        dbms_output.put_line(v2);
        exit when v1=10;
        v1:=v1+1;
      end loop;
    end;

    输出结果如下:

    示例3.只打印1-10的和,代码如下:

    declare
    v1 number:=1;--自增
    v2 number:=0;--求和
    begin
      loop
        v2:=v2+v1;
        exit when v1=10;
        v1:=v1+1;
      end loop;
       dbms_output.put_line(v2);
    end;

    输出如下:

    示例4. 不换行打印1-10,代码如下:

    declare
    v1 number:=0;
    begin
      loop
        v1:=v1+1;
        dbms_output.put(v1||',');
        exit when v1=10;
    end loop;
    dbms_output.put_line('');
    end;

    输出结果如下:

    示例5.循环打印1+2+3+4...+10=55这个式子,代码如下:

    declare
    v1 number:=1;--自增
    v2 number:=0;--求和
    begin
      loop
        v2:=v2+v1; --求和
        dbms_output.put(v1||'+');    
         v1:=v1+1;--自增
         exit when v1=10;--退出
    end loop;
    dbms_output.put_line(v1||'='||(v2+v1));
    end;

    输出结果如下:

    示例6.读取一张表中所有员工记录,代码如下:

     DECLARE
        v_empno emp.empno%TYPE;
        v_ename emp.ename%TYPE;
        v_job emp.job%TYPE;
        v_mgr emp.mgr%TYPE;
        v_hiredate emp.hiredate%TYPE;
        v_sal emp.sal%TYPE;
        v_comm emp.comm%TYPE;
        v_deptno emp.deptno%TYPE;
        CURSOR c_emp IS SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno 
        FROM emp;
    BEGIN
        OPEN c_emp;
        LOOP
            FETCH c_emp INTO v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno;
            EXIT WHEN c_emp%NOTFOUND;
            -- 在这里可以对每个员工记录进行处理,例如打印或者插入到另一个表中等操作
            DBMS_OUTPUT.PUT_LINE('empno=' || v_empno || ', ename=' || v_ename || ', job=' || v_job || ', mgr=' || v_mgr || ', hiredate=' || v_hiredate || ', sal=' || v_sal || ', comm=' || v_comm || ', deptno=' || v_deptno);
        END LOOP;
        CLOSE c_emp;
    END;

    上述代码我创建了一个名为 c_emp 的游标,该游标从 emp 表中选择所有员工记录。要知道游标是会遍历表所有行,然后我使用 LOOP 循环和 FETCH 语句来逐行读取游标中的数据,并将其存储到变量中。在每次循环迭代时,我可以对每个员工记录进行处理,例如打印或者插入到另一个表中等操作。最后,我再通过 CLOSE 语句关闭了游标。这里需要注意,使用游标时需要进行显式地打开和关闭操作。下图是输出结果:

    示例7.打印九九乘法表,代码如下:

    第一种格式对齐代码如下:

    begin
      Dbms_Output.put_line('九九乘法表');
      for i in 1..9 loop
      for j in 1..i loop
       dbms_output.put(j||'*'||i||'='|| lpad(i*j,2,0)||' ');
     end loop;
      dbms_output.put_line('');
     end loop;
    end;

     输出结果如下:

     第二种代码如下:

    declare
      i int:=1;
      j int:=1;
    begin
     loop
      loop
       Dbms_Output.put(i||'*'||j||'='||i*j);
       dbms_output.put(' '); 
       j:=j+1;
       exit when j>i; 
       end loop;
       dbms_output.put_line('');
       i:=i+1;
       j:=1;
       exit when i>9;
      end loop;
    end;

    输出结果如下:

    二、for循环

    FOR 循环是一种最常见的循环形式,在固定范围内反复执行某些操作,在程序中通常用于遍历一个数据集合或执行指定次数的操作。

    2.1for循环语法:

    FOR loop_counter IN [REVERSE] low_value..high_value LOOP
        -- statements to be executed
    END LOOP;
    --简单理解v:
    for 变量 in [reverse]小值..大值 loop  --(两值之间要有两个点,不能多不能少)
      要执行的语句;
      [exit when 中途退出的条件;]
    end loop;
    ·加上reverse是从大值循环到小值

    其中, loop_counter 为循环计数器,它可以是任何用户定义的变量或标识符; low_value high_value 表示循环计数器的起始值和终止值; REVERSE 为可选关键字,表示倒序循环。

    2.2for循环示例

    示例1.循环打印1-10,代码如下:

    begin
      for i in  1..10 loop
        dbms_output.put_line(i);
      end loop;
    end;

    输出结果如下: 

    示例2.循环打印1+2+3+4...+10=55这个式子,代码如下:

    declare
    v2 int:=0;
    begin
      for a in 1..9 loop
        v2:=v2+a;
       dbms_output.put(a||'+');
      end loop;
      dbms_output.put_line('10='||(v2+10));
    end;

    输出结果如下:

    示例3.打印直角三角形,如下图所示,

     代码如下:

    begin
      for i in 1..5 loop--控制层数
        for j in 1..i loop--控制每一层的星数
          dbms_output.put('* ');
        end loop;
        dbms_output.put_line('');
      end loop;
    end;

    输出结果和上图一致。

    示例4.打印九九乘法表,代码如下:

    begin
      for i in 1..9 loop
        for j in 1..i loop
          dbms_output.put(j||'×'||i||'='||j*i||'     ');
        end loop;
           dbms_output.put_line('');
        end loop;
     end;

    输出结果如下:

    三、while循环

    WHILE 循环是一种基于条件表达式的循环结构,只要条件表达式的结果为 TRUE,则会一直执行循环内的语句,直到条件变为 FALSE 才停止循环。也就是说它会根据指定条件重复执行某一段代码,直到条件不成立为止。

    3.1while循环语法

    其基本语法如下:

    WHILE condition LOOP
        -- statements to be executed
    END LOOP;
    --简单理解v:
    while 条件 --进入循环的条件
      loop
        要执行的语句;
        [exit when 退出条件;]--中途退出的条件
    end loop;

    其中, condition 是一个布尔表达式,当其值为 TRUE 时会执行循环内的语句。

    3.2while循环示例

    示例1.循环打印1-10,代码如下:

    declare 
    v1 int:=1;
    begin
      while v1<=10 loop
        dbms_output.put_line(v1);
        --exit when v1=5;
        v1:=v1+1;
      end loop;
    end;

    输出结果如下:

    示例2.循环打印1+2+3+4...+10=55这个式子,代码如下:

    declare 
    v1 int:=1;
    v2 int:=0;
    begin
      while v1<10 loop
        v2:=v2+v1;
        dbms_output.put(v1||'+');
        v1:=v1+1;
      end loop;
      dbms_output.put_line('10='||(v2+v1));
    end;

    输出结果如下:

    示例3.打印九九乘法表,代码如下:

    declare 
    i int:=1;
    j int:=1;
    begin
     while i<=9 loop j:=1;
       while j<=i loop
       Dbms_Output.put(i||'*'||j||'='||i*j);
       dbms_output.put(' ');
        j:=j+1;
     end loop;
      dbms_output.new_line;
      i:=i+1;
     end loop;
    end;

    输出结果如下:

    四、GOTO 循环

    GOTO 循环是一种标签控制形式,是一种无条件转移语句,用于跳转到程序中的指定标签位置。在指定标签前置了符号“:”后,通过 GOTO+标签名 的方式实现循环。

    4.1GOTO 循环语法

    其基本语法如下:

    <<label>>
    WHILE condition LOOP
      statement;
      [EXIT | EXIT WHEN condition];
      -- 跳转至标签位置
      GOTO label;
    END LOOP;
     

    其中 label 是循环名称,condition 和 statement 同 WHILE 循环的定义。如果要退出循环,可以使用 BREAK 语句或者在 loop 开始位置放置 EXIT 语句。

    4.2GOTO 循环示例

    示例1.循环打印1到10,代码如下:

    DECLARE
      i NUMBER := 1;
    BEGIN
      <<my_loop>> -- 声明标记名称my_loop
      IF i <= 10 THEN
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
        GOTO my_loop; -- 跳转到标记名称为my_loop的位置
      END IF;
    END;

    输出结果如下:

    示例2.打印九九乘法表,代码如下:

    DECLARE
      i NUMBER := 1;
      j NUMBER := 1;
    BEGIN
      <<my_loop1>> -- 标记名称为 my_loop1
      IF i <= 9 THEN 
        <<my_loop2>> -- 标记名称为 my_loop2
        IF j <= i THEN
          DBMS_OUTPUT.PUT(i || '*' || j || '=' || i*j || ' ');
          j := j + 1;
          GOTO my_loop2; -- 转移到标记名称为 my_loop2 的位置
        ELSE
          DBMS_OUTPUT.NEW_LINE;  -- 换行
          j := 1;
          i := i + 1;
          GOTO my_loop1; -- 转移到标记名称为 my_loop1 的位置
        END IF;
      END IF;
    END;

    日常情况使用goto循环的情况会比较少,我解释下上面的代码:在上述代码中,首先初始化变量 i j 并声明两个标记名称 my_loop1 my_loop2 。然后,在第一层循环中,检查 i 的值是否小于等于 9。如果是,则进入第二层循环,检查 j 的值是否小于等于 i 。如果是,则使用 DBMS_OUTPUT.PUT_LINE 函数输出乘法表的一项,并将变量 j 加 1。接着使用 GOTO 语句跳转到第二层循环的最开始位置(即标记名称为 my_loop2 的地方),继续执行乘法表循环。如果 j 的值大于 i ,则输出一个空行,并将变量 j 重置为 1,将 i 加 1。然后使用 GOTO 语句跳转到第一层循环的最开始位置(即标记名称为 my_loop1 的地方),继续执行乘法表循环。

    最后输出结果如下:

     注意:

           GOTO 循环是基于 PL/SQL 语言的特性,在 Oracle 数据库的多个版本中都支持。

    具体地说,GOTO 循环是在 Oracle Database 11g Release 2 和之后版本中引入的新特性。         如果使用的是 Oracle 数据库较老的版本,可能不支持该特性。

           虽然使用 GOTO 可以实现类似于循环的功能,但是它也可能会影响代码的可读性和维护性,代码设计时应优先考虑使用更好的循环结构方式(如WHILE循环、FOR循环等)来实现控制流程。同时,为了提高代码执行效率,应当尽量避免在PL/SQL中过度使用 GOTO 语句。

           在PL/SQL中,GO和CONTINUE语句可以使用类似的方式来实现迭代。通常情况下,使用带有明确退出条件的循环比使用GOTO更容易理解和调试。

    总结 

    到此这篇关于Oracle数据库中的循环语法及举例的文章就介绍到这了,更多相关Oracle循环内容请搜索PHP之友以前的文章或继续浏览下面的相关文章希望大家以后多多支持PHP之友!

    您可能感兴趣的文章:
    • Oracle显示游标的使用及游标for循环
    • Oracle中for循环的使用方法
    • Oracle三种循环(For、While、Loop)实现九九乘法表
    • Oracle存储过程循环语法实例分析

    www.htsjk.Com true http://www.htsjk.com/oracle/47593.html NewsArticle Oracle数据库中的循环语法及举例, 目录 前言 一、简单循环 1.1LOOP 循环语法: 1.2LOOP 循环示例 二、for循环 2.1for循环语法: 2.2for循环示例 三、while循环 3.1while循环语法 3.2while循环示例...
    评论暂时关闭