GOTO语句可以无条件跳到一个标签处
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BEGIN
...
IF credit_rating < 3 THEN
...
EXIT; -- not allowed
END IF;
END;
记住,EXIT语句必须放在循环内。如果想在PL/SQL块正常到达程序结尾之前而终止执行,可以使用RETURN语句。
EXIT-WHEN
EXIT-WHEN语句可以根据给定的条件跳出循环。当遇到EXIT语句时,WHEN子句中的表达式值就会被计算。如果条件满足,循环就会被终止,控制权转到循环语句之后的语句。示例如下:
LOOP
FETCH c1
INTO ...
EXIT WHEN c1%NOTFOUND; -- exit loop if condition is true
...
END LOOP;
CLOSE c1;
在条件满足之前,循环是不会结束的。所以,循环里的语句必须要改变循环条件的值。上例中,如果FETCH语句返回了一行值,WNEN子句中的条件就为假;如果不能返回结果,WNEN 子句中的条件就为真,循环就会结束,控制权转入CLOSE语句。
EXIT-WHEN语句可以替代简单的IF语句,例如,比较下面两段代码:
EXIT WHEN count > 100;
这两个语句在逻辑上是等价的,但EXIT-WHEN语句更容易阅读和理解。
循环标签
跟PL/SQL块一样,循环也是可以添加标签。标签必须出现在LOOP语句的开端,语法如下:
<
LOOP
sequence_of_statements
END LOOP;
而在LOOP语句结束部分出现的标签名称是可选的,语法如下:
<
LOOP
...
END LOOP my_loop;
在LOOP结束部分使用标签名称能够改善可读性。
无论使用哪种EXIT语句形式,都可以结束一个封闭的LOOP块,而不仅仅局限于当前的LOOP 块。只要在我们想结束的封闭LOOP块上添加一个标签,然后像下面这样在EXIT语句中使用这个标签就可以了:
<
LOOP
...
LOOP
...
EXIT outer WHEN ... -- exit both loops
END LOOP;
...
END LOOP outer;
2、WHILE-LOOP
WHILE condition LOOP
sequence_of_statements
END LOOP;
每次循环之前,程序都是计算布尔表达式的值。如果条件为真,语句序列就会被执行,然后重新返回循环顶部计算布尔表达式的值;如果布尔表达式的值为假或空,控制权就会被交给循环之后的语句。下面看一个例子:
WHILE total <= 25000 LOOP
...
SELECT sal
INTO salary
FROM emp
WHERE x = x; ...
total := total + salary;
END LOOP;
循环的次数是与条件相关的,而且在循环结束之前是未知的。由于条件是在循环顶部测试的,所以语句序列有可能一次都没有执行。在上面的例子中,如果total的初始值比25000大,那么条件值就是假,循环就会被跳过。
有些语言有LOOP UNTIL或是REPEAT UNTIL这样的结构,在底部测试条件表达式的值。这样,语句序列就会至少执行一次。PL/SQL没有这样的结构,但我们可以变通地使用下面的方法来实现这样的功能:
要保证WHILE循环至少执行一次,在条件表达式中使用初始化过的布尔变量,如下例所示:done := FALSE;
WHILE NOT done LOOP
sequence_of_statements;
done := boolean_expression;
END LOOP;
在循环内的语句必须为布尔变量赋上一个新值。否则循环就会无限地执行下去。如下例的两个LOOP语句在逻辑上是等价的:
WHILE TRUE LOOP
...
END LOOP;
LOOP
...
END LOOP;
3、FOR-LOOP
FOR语句会在指定的整数范围内进行循环操作。循环的内容被关键字FOR和LOOP封闭起来。两个"点"(..)作为范围操作符来使用。语法如下:
FOR counter IN [REVERSE] lower_bound..higher_bound LOOP
sequence_of_statements
END LOOP;
当首次进入FOR循环时,循环的范围就会被确定下来,并且不会重新计算。如下例所示,语句序列会执行三次,每执行一次,循环因子就会增加1。
下例演示了如果下界值等于上界值,循环中的语句序列只执行一次:
FOR i IN 3 .. 3 LOOP -- assign the values 3 to i
sequence_of_statements -- executes one time
END LOOP;
默认情况下,循环总是从下界到上界。不过也可以使用REVERSE关键字,让循环从上界往下界执行。但是要记住,范围的书写格式仍旧是递增顺序的。
FOR i IN REVERSE 1 .. 3 LOOP -- assign the values 3,2,1 to i
sequence_of_statements -- executes three times
END LOOP;
FOR循环里,循环计数器只能当作常量来引用且不能为它赋值,如下例:
FOR ctr IN 1 .. 10 LOOP
IF NOT finished THEN