(PLS-00103:在简单声明游标语句和循环选择数据期间遇到符号“;”)

Posted

技术标签:

【中文标题】(PLS-00103:在简单声明游标语句和循环选择数据期间遇到符号“;”)【英文标题】:(PLS-00103: Encountered the symbol ";") during simple declare cursor statement and loop over select data 【发布时间】:2021-01-13 11:54:07 【问题描述】:

每次我想在Oracle SQL中声明简单变量时,我都会变成PLS-00103错误..

DECLARE CURSOR my_data IS
    SELECT ID, NAME
    FROM NAMES
    WHERE NAME IN ('name1', 'name2', 'name3');
BEGIN
  FOR i IN my_data LOOP
         dbms_output.put_line(i.ID);
  END LOOP;
END;

我变成的错误:

[Code: 6550, SQL State: 65000]  ORA-06550: Zeile 4, Spalte 45:
PLS-00103: Fand das Symbol "end-of-file" als eines der folgenden erwartet wurde:
;
[Script position: 116 - 117]    
DECLARE CURSOR my_data IS
    SELECT ID, NAME
    FROM NAMES
    WHERE NAME IN ('name1', 'name2', 'name3')

[Code: 900, SQL State: 42000]  ORA-00900: Ungültige SQL-Anweisung
  [Script position: 188 - 191]  END LOOP

[Code: 900, SQL State: 42000]  ORA-00900: Ungültige SQL-Anweisung
  [Script position: 198 - 202]  END

为什么 Oracle 不能识别我在语句末尾使用的 ; 符号?声明游标后,我想对该列表进行循环并使用name 作为插入语句的一部分。

我使用 DBVisualizer Pro 11。

【问题讨论】:

DECLARE 之后换行。除此之外,您的代码看起来还不错。 @WernfriedDomscheit 新行没有帮助。我什至不认为这是否有帮助,因为 SQL 是缩进和换行不敏感的。 【参考方案1】:

你需要“更多”。 PL/SQL 块必须有一个 BEGIN-END(您将在该游标上处理)。因此,您通常会看到类似

DECLARE CURSOR my_data IS
    SELECT ID, NAME
    FROM NAMES
    WHERE NAME IN ('name1', 'name2', 'name3');
BEGIN
  for i in my_data loop
     ...
     ...
  end loop;
END;

【讨论】:

您好 Connor McDonals,不幸的是它不起作用,SQL 抛出更多错误,我已经扩展了我的问题并添加了有关迭代和声明期间错误的更多信息。【参考方案2】:

你发布的代码没问题:

SQL> select * from names;

        ID NAME
---------- ----------
      7782 CLARK
      7839 KING
      7934 MILLER

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     CURSOR my_data IS
  3        SELECT ID, NAME
  4          FROM NAMES
  5         WHERE NAME IN ('CLARK', 'KING', 'MILLER');
  6  BEGIN
  7     FOR i IN my_data
  8     LOOP
  9        DBMS_OUTPUT.put_line (i.ID);
 10     END LOOP;
 11  END;
 12  /
7782
7839
7934

PL/SQL procedure successfully completed.

SQL>

您使用哪种工具?这是您运行的整个脚本吗?因为,有些工具不允许命令彼此相邻,它们之间至少需要一个空行。

【讨论】:

我使用 DBVisualizer Pro 11.0.5,并且只在 SQL Commander 选项卡中运行此脚本。 我找到了解决方案。当我想在 DBVisualizer 中执行 PL/SQL 语句时,我还需要在第一行代码之前添加 --/,在最后一行代码之后添加 /。感谢您提供有关工具设置的提示! 对;我从未使用过 DBVisualizer,但现在用谷歌搜索它,遇到类似问题的人被告知要完全按照你的做法去做。我很高兴你修好了!【参考方案3】:

我找到了解决方案,问题出在DbVisualizer

要在 DBVisualizer 中执行 PL/SQL 语句,我还需要在第一行代码之前添加 --/,在最后一行代码之后添加 /

所以代码应该特别看起来像这样:

--/
DECLARE CURSOR my_data IS
    SELECT ID, NAME
    FROM NAMES
    WHERE NAME IN ('name1', 'name2', 'name3');
BEGIN
  FOR i IN my_data LOOP
         dbms_output.put_line(i.ID);
  END LOOP;
END;
/

【讨论】:

以上是关于(PLS-00103:在简单声明游标语句和循环选择数据期间遇到符号“;”)的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 过程、游标、PLS- 00103 错误

SQL 游标 FOR 循环,模式名称中带有 / 变量

我的函数声明中有错误 PLS-00103,我找不到问题

PLS-00103:在简单更新块中遇到符号“文件结尾”

PL/SQL 触发游标错误

试图声明一个游标,但我被文件结尾击中了! (甲骨文 SQL)