当前位置:   article > 正文

Oracle中的循环_oracle loop

oracle loop

 

目录

一、简单循环

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 循环的语法如下:

  1. LOOP
  2. -- statements to be executed
  3. EXIT [WHEN condition];
  4. END LOOP;
  5. --简单理解为:
  6. loop
  7. 要执行的语句; ┐
  8. exit when 退出条件; ├循环体
  9. [要执行的语句;] ┘
  10. end loop;

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

1.2LOOP 循环示例

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

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

  1. declare
  2. v1 number:=0;
  3. begin
  4. loop
  5. v1:=v1+1;
  6. dbms_output.put_line(v1);
  7. exit when v1=10;
  8. end loop;
  9. end;

输出结果如下:

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

  1. declare
  2. v1 number:=1;--自增
  3. v2 number:=0;--求和
  4. begin
  5. loop
  6. v2:=v2+v1;
  7. dbms_output.put_line(v2);
  8. exit when v1=10;
  9. v1:=v1+1;
  10. end loop;
  11. end;

输出结果如下:

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

  1. declare
  2. v1 number:=1;--自增
  3. v2 number:=0;--求和
  4. begin
  5. loop
  6. v2:=v2+v1;
  7. exit when v1=10;
  8. v1:=v1+1;
  9. end loop;
  10. dbms_output.put_line(v2);
  11. end;

输出如下:

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

  1. declare
  2. v1 number:=0;
  3. begin
  4. loop
  5. v1:=v1+1;
  6. dbms_output.put(v1||',');
  7. exit when v1=10;
  8. end loop;
  9. dbms_output.put_line('');
  10. end;

输出结果如下:

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

  1. declare
  2. v1 number:=1;--自增
  3. v2 number:=0;--求和
  4. begin
  5. loop
  6. v2:=v2+v1; --求和
  7. dbms_output.put(v1||'+');
  8. v1:=v1+1;--自增
  9. exit when v1=10;--退出
  10. end loop;
  11. dbms_output.put_line(v1||'='||(v2+v1));
  12. end;

输出结果如下:

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

  1. DECLARE
  2. v_empno emp.empno%TYPE;
  3. v_ename emp.ename%TYPE;
  4. v_job emp.job%TYPE;
  5. v_mgr emp.mgr%TYPE;
  6. v_hiredate emp.hiredate%TYPE;
  7. v_sal emp.sal%TYPE;
  8. v_comm emp.comm%TYPE;
  9. v_deptno emp.deptno%TYPE;
  10. CURSOR c_emp IS SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
  11. FROM emp;
  12. BEGIN
  13. OPEN c_emp;
  14. LOOP
  15. FETCH c_emp INTO v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno;
  16. EXIT WHEN c_emp%NOTFOUND;
  17. -- 在这里可以对每个员工记录进行处理,例如打印或者插入到另一个表中等操作
  18. 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);
  19. END LOOP;
  20. CLOSE c_emp;
  21. END;

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

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

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

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

 输出结果如下:

 第二种代码如下:

  1. declare
  2. i int:=1;
  3. j int:=1;
  4. begin
  5. loop
  6. loop
  7. Dbms_Output.put(i||'*'||j||'='||i*j);
  8. dbms_output.put(' ');
  9. j:=j+1;
  10. exit when j>i;
  11. end loop;
  12. dbms_output.put_line('');
  13. i:=i+1;
  14. j:=1;
  15. exit when i>9;
  16. end loop;
  17. end;

输出结果如下:

二、for循环

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

2.1for循环语法:

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

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

2.2for循环示例

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

  1. begin
  2. for i in 1..10 loop
  3. dbms_output.put_line(i);
  4. end loop;
  5. end;

输出结果如下: 

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

  1. declare
  2. v2 int:=0;
  3. begin
  4. for a in 1..9 loop
  5. v2:=v2+a;
  6. dbms_output.put(a||'+');
  7. end loop;
  8. dbms_output.put_line('10='||(v2+10));
  9. end;

输出结果如下:

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

 

 代码如下:

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

输出结果和上图一致。

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

  1. begin
  2. for i in 1..9 loop
  3. for j in 1..i loop
  4. dbms_output.put(j||'×'||i||'='||j*i||' ');
  5. end loop;
  6. dbms_output.put_line('');
  7. end loop;
  8. end;

输出结果如下:

三、while循环

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

3.1while循环语法

其基本语法如下:

  1. WHILE condition LOOP
  2. -- statements to be executed
  3. END LOOP;
  4. --简单理解v:
  5. while 条件 --进入循环的条件
  6. loop
  7. 要执行的语句;
  8. [exit when 退出条件;]--中途退出的条件
  9. end loop;

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

3.2while循环示例

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

  1. declare
  2. v1 int:=1;
  3. begin
  4. while v1<=10 loop
  5. dbms_output.put_line(v1);
  6. --exit when v1=5;
  7. v1:=v1+1;
  8. end loop;
  9. end;

输出结果如下:

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

  1. declare
  2. v1 int:=1;
  3. v2 int:=0;
  4. begin
  5. while v1<10 loop
  6. v2:=v2+v1;
  7. dbms_output.put(v1||'+');
  8. v1:=v1+1;
  9. end loop;
  10. dbms_output.put_line('10='||(v2+v1));
  11. end;

输出结果如下:

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

  1. declare
  2. i int:=1;
  3. j int:=1;
  4. begin
  5. while i<=9 loop j:=1;
  6. while j<=i loop
  7. Dbms_Output.put(i||'*'||j||'='||i*j);
  8. dbms_output.put(' ');
  9. j:=j+1;
  10. end loop;
  11. dbms_output.new_line;
  12. i:=i+1;
  13. end loop;
  14. end;

输出结果如下:

四、GOTO 循环

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

4.1GOTO 循环语法

其基本语法如下:

  1. <<label>>
  2. WHILE condition LOOP
  3. statement;
  4. [EXIT | EXIT WHEN condition];
  5. -- 跳转至标签位置
  6. GOTO label;
  7. END LOOP;

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

4.2GOTO 循环示例

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

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

输出结果如下:

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

  1. DECLARE
  2. i NUMBER := 1;
  3. j NUMBER := 1;
  4. BEGIN
  5. <<my_loop1>> -- 标记名称为 my_loop1
  6. IF i <= 9 THEN
  7. <<my_loop2>> -- 标记名称为 my_loop2
  8. IF j <= i THEN
  9. DBMS_OUTPUT.PUT(i || '*' || j || '=' || i*j || ' ');
  10. j := j + 1;
  11. GOTO my_loop2; -- 转移到标记名称为 my_loop2 的位置
  12. ELSE
  13. DBMS_OUTPUT.NEW_LINE; -- 换行
  14. j := 1;
  15. i := i + 1;
  16. GOTO my_loop1; -- 转移到标记名称为 my_loop1 的位置
  17. END IF;
  18. END IF;
  19. END;

日常情况使用goto循环的情况会比较少,我解释下上面的代码:在上述代码中,首先初始化变量 ij 并声明两个标记名称 my_loop1my_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更容易理解和调试。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/547366
推荐阅读
相关标签
  

闽ICP备14008679号