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

相关推荐
运维行者_5 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev6 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1236 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器6 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天7 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
南墙上的石头8 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画9 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc9 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t10 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波10 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql