下面的代码完美运行
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 文档,但它没有提到这样的事情。
版本之间的文档更改;有时较新的版本不包含以前版本中存在的有用信息。
在10g GOTO语句中,它说:
GOTO 语句无条件分支到语句标签或块标签。标签在其范围内必须是唯一的,并且必须位于可执行语句或 PL/SQL 块之前。 GOTO 语句将控制转移到带标签的语句或块
END;
不是可执行语句; NULL;
(或你的x := 100;
)是。