为什么标签不能在end之前声明

问题描述 投票:0回答:1

下面的代码完美运行

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

我知道标签应该直接出现在它们所标记的内容之前,即使它只是 NULL 语句,它也必须是可执行语句。那么

END;
不考虑作为一个声明吗?

我需要知道为什么它会抛出错误。我还参考了Oracle 文档,但它没有提到这样的事情。

oracle loops plsql
1个回答
0
投票

版本之间的文档更改;有时较新的版本不包含以前版本中存在的有用信息。

10g GOTO语句中,它说:

GOTO 语句无条件分支到语句标签或块标签。标签在其范围内必须是唯一的,并且必须位于可执行语句或 PL/SQL 块之前。 GOTO 语句将控制转移到带标签的语句或块

END;
不是可执行语句;
NULL;
(或你的
x := 100;
)是。

© www.soinside.com 2019 - 2024. All rights reserved.