GOTO语句在PL/SQL中的应用

PL/SQL也提供GOTO语句,其语法是
GOTO label;
这里label是在PL/SQL块中定义的标签.标签是用双箭头括号括起来的.当执行GOTO语句的时候,控制会立即转到由标签标识的语句.

例如,我们可以按照下面的方式实现前面的循环示例.
Declare
vn:=1;
begin
loop
insert into temptable
values(vn,'loopcount');
vn := vn + 1;
if vn > 50 then
GOTO nextloop;
end if;
end loop;
<<nextloop>>
insert into temptable(char_col)
values('done!');
end;
一:对于GOTO的限制
1:PL/SQL对于GOTO的使用有一些限制.对于块,循环或者IF语句而言,想要从外层跳转到内层是非法的.下面就是一个非法的例子.
BEGIN
GOTO 1_innerBlock;
BEGIN
......
<<1_innerBlock;>>
......
END;
GOTO 1_INSIDEIF;
if x > 3 then
...
<<1_INSIDEIF>>
insert into ....
end if;
end if;
如果这样的写法是合法的,那么甚至尽管IF条件没有求值为TRUE,IF语句中的语句也将被执行.在前面的例子中,当X =2 时,INSERT 语句可能要被执行.

2:使用GOTO语句从一个IF子句跳转到另一个子句中也是非法的.
BEGIN
IF X >3 THEN
...
GOTO 1_nextcondition;
ELSE
<<1_nextcondition>>
....
END IF;
END;

3:最后,从一个异常处理块内部跳转到当前块是非法的.
begin
<<1_insert>>
insert into....;
exception when others then
GOTO 1_insert;
end;
二.为循环设定标签
循环本身是可以被设计标签的.如果进行了设定,那么可以在EXIT语句中使用该标签指明要退出哪个循环.例如:
<<1_outer>>
for v_outerindex in 1..50 loop
...
<<1_inner>>
for v_innerindex in 2..10 loop
...
if v_outerindex > 40 then
exit 1_outer;
end if;
end loop 1_inner;
end loop 1_outer;
如果为循环设定了标签,那么可以在END LOOP 语句的后面包含该标签名,正如上面的例子中所示的那样.
三.GOTO语句的使用指南
在使用GOTO的时候请一定小心.不必要的GOTO语句会产生出"通心粉代码",这是一些无目的的跳来跳去的代码,很难理解和进行维护.
几乎所有使用GOTO的情况都可以使用其他的PL/SQL控制结构,例如循环或者条件结构,来重新进行编写.也可以使用异常处理来退出
深层嵌套的循环,而不用直接跳转到结尾.

posted @ 2008-09-17 12:14  QQ天堂  阅读(4450)  评论(0编辑  收藏  举报