1.先看exit
和return
将exit
或是 return
用在loop 。。。。end loop;
中都可以中断循环,但是它们有一个很明显的不同
看下面两个例子:
例一:
CREATE OR replace PACKAGE BODY cux_test
IS
PROCEDURE Main
IS
l_count NUMBER;
l_test NUMBER := 6;
BEGIN
dbms_output.Put_line('开始循环');
FOR l_count IN 1..10 LOOP
IF l_test = l_count THEN
dbms_output.Put_line('满足条件,退出循环');
RETURN;
ELSE
dbms_output.Put_line('继续循环');
END IF;
END LOOP;
dbms_output.Put_line('结束程序');
END;
END cux_test;
例二:
CREATE OR replace PACKAGE BODY cux_test
IS
PROCEDURE Main
IS
l_count NUMBER;
l_test NUMBER := 6;
BEGIN
dbms_output.Put_line('开始循环');
FOR l_count IN 1..10 LOOP
IF l_test = l_count THEN
dbms_output.Put_line('满足条件,退出循环');
exit; --exit when x>=8;可以加条件
ELSE
dbms_output.Put_line('继续循环');
END IF;
END LOOP;
dbms_output.Put_line('结束程序');
END;
END cux_test;
下面来看以上两个例子的执行结果:
例一:
开始循环
继续循环
继续循环
继续循环
继续循环
继续循环
满足条件,退出循环
例二:
开始循环
继续循环
继续循环
继续循环
继续循环
继续循环
满足条件,退出循环
结束程序
以上的例子说明了一个问题,exit
只是单纯的结束循环,但还会继续执行程序包中其他的内容,而return
则是直接中断整个程序。
2.continue
的作用是终止本次循环,开始下一次循环,它不是跳出循环。
而oracle
数据库之前却一直没有支持continue
语法,直到oracle11g
加入了continue
语法,其功能也是终止本次循环,开始下一次循环,exit
语法的作用是跳出并结束循环。
BEGIN
FOR i IN 1 .. 20 LOOP
IF i < 10 THEN
CONTINUE;
END IF;
dbms_output.Put_line(i);
END LOOP;
END;
结果:
10
11
12
13
14
15
16
17
18
19
20
当i等于1到9的时候,程序运行到continue
,使得当前循环停止,开始下一次循环,当i等于10的时候,不会执行到continue
,所以从10开始输出。
Oracle循环中的EXIT、RETURN、CONTINUE
解密
有时候编写Oracle
中用游标等信息去循环处理逻辑的时候,对EXIT、RETURN、CONTINUE
很容易搞混淆,网上搜了资料也不是很清楚,所以本人自己写了一小段代码测试了这三种用法。案例代码如下:
PROCEDURE P_TASK IS
BEGIN
FOR MY_CU IN (SELECT SPBH, SPMCH FROM FUCM) LOOP
FOR MY IN (SELECT SPBH, SPMCH FROM FUCM) LOOP
IF MY_CU.SPBH = 'AAA' THEN
RETURN;
--exit;
--continue;
ELSIF MY.SPBH = 'BBB' THEN
INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('123', '123');
ELSE
INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('222', '222');
END IF;
INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('333', '333');
END LOOP;
END LOOP;
INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('444', '444');
END P_TASK;
案例测试得到结果如下(分析的结果中注意本次循环和本循环的区别。本次循环是本循环执行的这次循环):
第一种:使用RETURN
的时候,直接跳出存储过程或者函数
第二种:使用EXIT
的时候,跳出本循环转而执行本循环的上一级循环的下一次循环。就此案例而言MY_CU.SPBH = 'AAA'
为真的时候,直接跳出MY
循环转而去执行MY_CU
的下一次循环
第三种:使用CONTINUE
的时候,本次循环后面的代码部分不再执行,转而执行本循环的下一次循环。就此案例而言MY_CU.SPBH = 'AAA'
为真的时候,后面的代码不执行,继续MY
的下一次循环