GOTO语句可以无条件跳到一个标签处

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档