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

相关推荐
两点王爷8 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷8 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技8 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
TDengine (老段)9 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Lucifer三思而后行11 小时前
Oracle SQL 优化实战:明明走了索引,SQL 还是慢?
sql·oracle
螺蛳粉 螺蛳粉12 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
这个DBA有点耶16 小时前
从OLTP到OLAP到HTAP:数据库负载分类的技术演进与选型指南
数据库·mysql·架构
YangYang9YangYan18 小时前
商业数据分析校招项目怎么选,附项目设计与简历包装思路
大数据·数据库·数据分析
李白客18 小时前
数据库培训怎么选?零基础到DBA的学习路线与机构认证对比(2026)
数据库·学习
shark-chili18 小时前
关于AI辅助编程的认知
数据库·人工智能·redis·macos·缓存