一.循环
在所有的编程语言中,循环都是一个非常重要的语法,掌握循环,是程序员必不可少的工具。
在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的作用,是跳出整个语句,如果是存储过程,则跳出存储过程,如果是函数,则跳出整个函数。