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

相关推荐
寒月霜华35 分钟前
JavaWeb后端-MySQL
数据库·mysql
Fuly102443 分钟前
大模型的记忆与管理及长期记忆实现方式
数据库·人工智能·rag
weixin_307779131 小时前
C#程序实现将Teradata的存储过程转换为Azure Synapse Dedicated SQL pool的存储过程
数据库·数据分析·c#·云计算·azure
vortex51 小时前
在 Windows 系统中安装 Oracle、SQL Server(MSSQL)和 MySQL
windows·oracle·sqlserver
折翼的恶魔1 小时前
SQL 189 统计有未完成状态的试卷的未完成数和未完成率
数据库·sql
yangmf20402 小时前
如何使用 INFINI Gateway 增量迁移 ES 数据
大数据·数据库·elasticsearch·搜索引擎·gateway
运维李哥不背锅3 小时前
Ansible 的条件语句与循环详解
数据库·ansible
曾凡宇先生3 小时前
OpenEuler中mysql这是在执行 MySQL 密码重置操作时出现的 “找不到mysqld_safe命令” 的错误场景。
数据库·mysql
方二华4 小时前
6 mysql源码中的查询逻辑
数据库·mysql
意疏4 小时前
LibreTV无广告观影实测:聚合全网资源,远程访问家庭影院新方案!
数据库