You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:42:54