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的作用,是跳出整个语句,如果是存储过程,则跳出存储过程,如果是函数,则跳出整个函数。

相关推荐
今晚务必早点睡15 分钟前
微服务改数据库密码后服务仍能访问?一次“看似异常、实则常见”的生产现象全解析
数据库·微服务·oracle
老师我太想进步了20262 小时前
cmd连接MySQL及相关查询
数据库·mysql
難釋懷4 小时前
Redis命令-Set命令
数据库·redis·缓存
Linux-palpitate5 小时前
PostgreSQL(PG)的1主2从集群部署安装
数据库·postgresql
dingdingfish5 小时前
Oracle数据库19c技术架构
oracle·database·architecture·19c·technical
heartbeat..5 小时前
数据库基础知识体系:概念、约束、范式与国产产品
java·数据库·学习笔记·国产数据库
山峰哥6 小时前
数据库工程核心:SQL调优让查询效率飙升的实战密码
网络·汇编·数据库·sql·编辑器
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-DDD业务领域模块设计思路
java·数据库·人工智能·spring boot·ddd
小雪_Snow7 小时前
Windows 安装 MySQL 8.0 教程【安装包方式】
数据库·mysql
无敌的牛7 小时前
MySQL初阶
数据库·mysql