Oracle中的循环

一.循环

  在所有的编程语言中,循环都是一个非常重要的语法,掌握循环,是程序员必不可少的工具。

  在Oracle中,常用的有四种循环,loop循环,while循环,for循环和goto循环,在本篇文章中,会向大家分别介绍这几种循环的语法,实例和基本使用注意等。(均为匿名块或有名块)

1. loop循环

  loop经常会与exit when关键字结合使用,具体语法如下:

|-----------|------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | loop ``--开始循环的标志 ``loop_body; ``--要执行的语句 ``exit ``when 条件; ``--退出循环的条件 ``[loop_body;] ``--要执行的语句 end loop; ``--结束循环的标志 |

循环输出数值:

|-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 1. 循环打印0-100之间的所有偶数,并求和 declare var_num ``int``:=0; var_sum ``int``:=0; begin ``loop ``dbms_output.put_line(var_num); ``var_sum := var_sum + var_num; ``var_num := var_num + 2; ``exit ``when var_num >100; ``end loop; ``dbms_output.put_line(var_sum); end``; 2. 循环打印1+2+3+4+...+10 = 55这个式子和结果 declare var_num ``int``:= 1; var_sum ``int``:= 0; begin ``loop ``dbms_output.put(var_num); ``var_sum := var_sum + var_num; ``var_num := var_num + 1; ``exit ``when var_num > 10; ``dbms_output.put(``'+'``); ``end loop; ``dbms_output.put_line(``'='``||var_sum); end``;  |

2. while循环

  while循环和loop循环的语法非常相似,不过相较于loop循环,while循环多出了进入循环的条件,具体语法如下:

|-------------|------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 | while 条件 ``--进入循环的条件 ``loop ``--循环开始的标志 ``loop_body; ``--要执行的循环语句 ``[exit ``when 条件;] ``--中途退出的条件 ``end loop; end``; |

  依旧是循环打印1-100之间的所有偶数,观察两者之间的区别

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

  循环打印1+2+3+...+10=55这个式子和结果:

|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | declare var_num ``int := 1; var_sum ``int := 0; begin ``while var_num <= 10 ``loop ``dbms_output.put(var_num); ``var_sum := var_sum + var_num; ``var_num := var_num + 1; ``exit ``when var_num > 10; ``dbms_output.put(``'+'``); ``end loop; ``dbms_output.put_line(``'='``||var_sum); end``; |

3. for 循环

for循环是四种循环中最为简单的一种,具体语法如下:

|---------|------------------------------------------------------------------------------------------------|
| 1 2 3 4 | for 变量 ``in [reverse] 小值..大值 loop ``loop_body; ``[exit ``when 条件]; end loop; |

  reverse是逆转的意思,当有reverse关键字时,后面紧跟的值要反过来写,即大值..小值

|-------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 循环打印0-100之间的所有偶数 begin ``for var_num ``in 0..100 loop ``if mod(var_num,2) = 0 ``then ``dbms_output.put_line(var_num); ``end if; ``end loop; end``; # 循环打印1+2+3+...+10=55的式子和结果 declare var_sum ``int := 0; begin ``for var_num ``in 1..10-1 loop ``dbms_output.put(var_num); ``dbms_output.put(``'+'``); ``var_sum := var_sum + var_num; ``end loop; ``dbms_output.put_line(``'10='``||(var_sum+10)); end``; |

4. goto循环

goto的用法和其他三种循环都不一样,当使用goto时,可以无条件的跳到处于同一个PL/SQL块的任意执行语句处。具体使用方法如下:

|-------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 循环打印0-100之间的所有偶数,并求和<br>``declare var_num ``int := 0; var_sum ``int := 0; begin ``<<routine>> ``--定义goto标签 ``var_num := var_num + 1; ``--循环体,也就是需要执行的循环部分 ``if mod(var_num,2) = 0 ``then ``dbms_output.put_line(var_num); ``var_sum := var_sum + var_num; ``end if; ``if var_num <= 100 ``then --进入循环的条件 ``goto routine; ``--返回上面的循环 ``end if; ``dbms_output.put_line(var_sum); end``; |

  利用goto循环,循环打印1+2+3+...+10=55这个式子和结果:

|----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | declare var_num ``int := 1; var_sum ``int := 0; begin ``<<circulate>> ``dbms_output.put(var_num); ``var_sum := var_sum + var_num; ``var_num := var_num + 1; # 加号也是重复出现的,所以利用循环进行循环打印 # 当var_sum+10,var_num再加上一等于11时,就不再需要加号 ``if var_num <= 10 ``then ``dbms_output.put(``'+'``); ``end if; ``if var_num <= 10 ``then ``goto circulate; ``end if; ``dbms_output.put_line(``'='``||var_sum); end``;  |

二. continue,retune,exit的使用

1. continue

continue在英文中有继续的意思,在oracle中结合循环使用,则是跳过本次循环,继续下一次循环。

  利用cintinue关键字,可以轻松的做到数据的筛选,例如打印0-100之间的所有偶数:

|----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | declare var_num ``int := -1; begin ``loop ``var_num := var_num +1; # 当大于100时,会结束整个循环 ``exit ``when var_num > 100; # 当变量为奇数时,会跳过之后的执行语句,结束这次循环,从而进入下次循环 ``if mod(var_num,2) =1 ``then ``continue``; ``end if; ``dbms_output.put_line(var_num); ``end loop; end``; |

  和exit比较,continue不会跳出整个循环,它只是跳过不符合条件的本次循环,从而开启新的循环,依旧处于循环阶段,直到所有数据全部循环完毕。而exit则是在符合条件后,直接结束整个循环部分,转而去执行循环体外的其他内容。

2. return

在循环中使用exit和return时,两者的作用都是跳出整个循环,不过不同于exit ,return在跳出整个循环的同时,循环体外的其他内容也不会执行。

  下面给出几段代码,查看两者的不同:

|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 | begin ``for var_num ``in 1..5 loop ``if var_num = 3 ``then ``exit;    ``--return; ``end if; ``dbms_output.put_line(var_num); ``end loop; ``dbms_output.put_line(``'I love oracle!'``); end``;  |

  结果:

|-----------------|------------------------------------------------------|
| 1 2 3 4 5 6 7 8 | exit: 1 2 I love oracle! return``: 1 2 |

  可以看出相较于exit,return直接跳出了整个循环,同时还跳过了循环外的执行语句,直接结束了整段代码。结合网上查到的资料,则可以总结到:在oracle中,return的作用,是跳出整个语句,如果是存储过程,则跳出存储过程,如果是函数,则跳出整个函数。

相关推荐
En^_^Joy20 分钟前
Django开发:模板系统入门指南
数据库·django·sqlite
无关86881 小时前
Redis Bitmaps 用户签到系统设计方案
数据库·redis·缓存
江华森1 小时前
FastAPI 极速开发指南 — 从零到生产级 API 实战
数据库·fastapi
老纪2 小时前
Redis分布式锁进第九零篇
数据库·redis·分布式
haven-8522 小时前
MySQL事务ACID、隔离级别、MVCC、幻读解决
数据库·mysql
小高学习java3 小时前
事务的边界问题,如何判断数据回滚时机。
java·数据库·后端
迷枫7123 小时前
【无标题】
数据库
TDengine (老段)4 小时前
TDengine 扫描算子 — TableScan、TagScan 与下推优化
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
放下华子我只抽RuiKe54 小时前
FastAPI 全栈后端(三):数据库与 ORM
前端·数据库·react.js·oracle·性能优化·前端框架·fastapi
BAGAE4 小时前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase