Oracle PL/SQL中标签无法在END前声明的报错原因问询
PL/SQL GOTO标签后接END报错原因解析
问题场景
以下PL/SQL代码可正常运行:
DECLARE x NUMBER := 0; BEGIN LOOP IF x > 5 THEN GOTO my_label; END IF; dbms_output.put_line(x); x := 1 + x; END LOOP; << my_label >> x := 100; END;
但移除语句x := 100;后,会触发如下语法错误:
ORA-06550: line 13, column 1: PLS-00103: Encountered the symbol "END" when expecting one of the following: ( begin case declare exit for goto if loop mod null raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge standard pipe purge json_object
已知GOTO标签必须紧跟可执行语句(即使是NULL;空语句),但疑惑END;为何不被视为语句,特此询问报错原因。
原因解析
- PL/SQL语法明确要求,
<<标签名>>这类GOTO标签必须直接前缀于可执行语句,而END;属于PL/SQL块的结构终止标记,并非可执行语句范畴。 - 可执行语句指的是能执行具体操作的代码,包括赋值语句、流程控制语句、DML语句,甚至是不执行任何操作的
NULL;空语句;而END;仅用于标记BEGIN...END块的结束,本身不执行任何业务逻辑或操作,不符合可执行语句的定义。 - 当标签后没有可执行语句直接衔接
END;时,编译器无法找到标签应关联的合法可执行语句,因此抛出PLS-00103语法错误。
解决方法
如果不需要在标签后执行任何操作,只需添加NULL;空语句作为标签的关联语句即可:
DECLARE x NUMBER := 0; BEGIN LOOP IF x > 5 THEN GOTO my_label; END IF; dbms_output.put_line(x); x := 1 + x; END LOOP; << my_label >> NULL; -- 空语句作为标签关联的可执行语句 END;
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

