#标签
标签是一个命名标记,用于对程序的特定部分做标记,格式为
<<label>>
statements;
标签可用于程序块,循环以及GOTO
等语句。
#用于程序块
标记程序块的语法为:
<<block_label>>
DECLARE
...
BEGIN
...
END;
随后在程序块中,可以使用语法
block_label.declared_object
的方式引用对应的程序块中声明的对象。通过这个特性可以实现在嵌套块中具有相同名称的声明对象时,从子块中引用父块中的同名对象。
<<parent>>
DECLARE
variable1 NUMBER := 0;
BEGIN
<<child>>
DECLARE
variable1 NUMBER := 1;
BEGIN
DBMS_OUTPUT.PUT_LINE('parent: ' || TO_CHAR(parent.variable1));
DBMS_OUTPUT.PUT_LINE('child: ' || TO_CHAR(child.variable1));
END;
END;
#用于循环
标记循环的语法为:
<<label>>
LOOP
sequence_of_statements;
END LOOP label;
在有多重嵌套循环的时候,使用标签可以使程序更加易读。
#用于GOTO语句
GOTO语句结合标签使用可以实现无条件的跳转。
BEGIN
GOTO label_1;
statments1;
<<label_1>>
statements2;
END;
statments1
不会被执行,因为GOTO
语句直接把程序流跳转到了statements2
处。
同GOTO
语句用法类似,标签还可用于EXIT
和CONTINUE
语句。
##GOTO的限制
- 不能使用
GOTO
跳转到IF
语句,CASE
语句,LOOP
语句以及子块内部 - 不能使用
GOTO
语句直接从异常处理中跳转回当前的块的执行区中 - 不能使用
GOTO
语句直接跳转出子程序(函数或过程),只能跳转到子程序的末尾,GOTO
语句只能在当前块中跳转 - 不能从
IF
语句的一个分支中用GOTO
条件跳转到另一个分支,同样也不能在CASE
语句的不同WHEN
分支之间进行跳转
##GOTO并不常用
虽然在一些特定的情况下,GOTO
语句可以更加容易表达某些逻辑。但是GOTO
实现的功能,通过IF
和CASE
也可以实现,而GOTO
的引入让代码逻辑变得不太简洁易读,所以GOTO
并不常用。