PLS-00103:在 Oracle 11g 中遇到符号“DECLARE”

Posted

技术标签:

【中文标题】PLS-00103:在 Oracle 11g 中遇到符号“DECLARE”【英文标题】:PLS-00103: Encountered the symbol "DECLARE" in Oracle 11g 【发布时间】:2021-09-05 01:00:14 【问题描述】:

这是我查找最高和最低工资员工的查询,如下:

create or replace procedure Minmax 
( H_EMP_NO OUT EMP.EMPNO%TYPE, L_EMP_NO OUT EMP.EMPNO%TYPE) 
IS
BEGIN
 SELECT EMPNO INTO H_EMP_NO FROM EMP
 WHERE SAL = (SELECT MAX(SAL) FROM EMP);

 SELECT EMPNO INTO L_EMP_NO FROM EMP
 WHERE SAL = (SELECT MIN(SAL) FROM EMP);
END minmax;


DECLARE
 H_EMP_NO EMP.EMPNO%TYPE;
 L_EMP_NO EMP.EMPNO%TYPE;
 H_SAL EMP.SAL%TYPE;
 L_SAL EMP.SAL%TYPE;

BEGIN

Minmax(H_EMP_NO, L_EMP_NO);

SELECT SAL INTO H_SAL FROM EMP
WHERE EMPNO = H_EMP_NO;

SELECT SAL INTO L_SAL FROM EMP
WHERE EMPNO = L_EMP_NO;


DBMS_OUTPUT.PUT_LINE(H_EMP_NO || ' HAVE MAXIMUM SALARY = ' || H_SAL);
DBMS_OUTPUT.PUT_LINE(L_EMP_NO || ' HAVE MINIMUM SALARY = ' || L_SAL);

END;

我记得几天前我运行了相同的查询,它工作正常,但现在它说 PLS-00103:遇到符号“DECLARE”

我想提一下,我在 Declare 之前尝试过使用 / symbol,但随后它说: PLS-00103:遇到符号“/”

【问题讨论】:

那些似乎是一个过程和一个匿名块,而不是查询。 在 PL/SQL Developer 中,您应该在程序窗口中打开过程代码,并将其保存为 .prc 文件或其他约定的扩展名(可在首选项设置中配置)。您可以将测试窗口用于匿名块,并使用 .tst 扩展名保存它们。 【参考方案1】:

在中间加一个斜线

END minmax;
/                    --> this

DECLARE

因为,当您“串行”运行多个 PL/SQL 过程时,它们必须以某种方式终止 - 这是一个斜线。

或者,如果您先创建一个过程,则这样做(通过删除其他所有内容,或者 - 可能 - 通过选择(您知道,用鼠标“使其变为蓝色”)那段代码并只运行它。然后执行匿名 PL/SQL 块(再次 - 通过选择它,或通过删除过程)。


为了说明这一点:您的代码没有改变。我添加的只是第 11 行(第一个代码)和第 22 行(第二个代码)中的斜线:

SQL> create or replace procedure Minmax
  2  ( H_EMP_NO OUT EMP.EMPNO%TYPE, L_EMP_NO OUT EMP.EMPNO%TYPE)
  3  IS
  4  BEGIN
  5   SELECT EMPNO INTO H_EMP_NO FROM EMP
  6   WHERE SAL = (SELECT MAX(SAL) FROM EMP);
  7
  8   SELECT EMPNO INTO L_EMP_NO FROM EMP
  9   WHERE SAL = (SELECT MIN(SAL) FROM EMP);
 10  END minmax;
 11  /

Procedure created.

SQL> DECLARE
  2   H_EMP_NO EMP.EMPNO%TYPE;
  3   L_EMP_NO EMP.EMPNO%TYPE;
  4   H_SAL EMP.SAL%TYPE;
  5   L_SAL EMP.SAL%TYPE;
  6
  7  BEGIN
  8
  9  Minmax(H_EMP_NO, L_EMP_NO);
 10
 11  SELECT SAL INTO H_SAL FROM EMP
 12  WHERE EMPNO = H_EMP_NO;
 13
 14  SELECT SAL INTO L_SAL FROM EMP
 15  WHERE EMPNO = L_EMP_NO;
 16
 17
 18  DBMS_OUTPUT.PUT_LINE(H_EMP_NO || ' HAVE MAXIMUM SALARY = ' || H_SAL);
 19  DBMS_OUTPUT.PUT_LINE(L_EMP_NO || ' HAVE MINIMUM SALARY = ' || L_SAL);
 20
 21  END;
 22  /
7839 HAVE MAXIMUM SALARY = 5000
7369 HAVE MINIMUM SALARY = 800

PL/SQL procedure successfully completed.

SQL>

【讨论】:

报错还是说:PLS-00103: Encountered the symbol "/" 我编辑了答案并添加了一个示例,表明它有效;请看一下。 我尝试过选择 which 意味着首先只创建过程,然后执行调用该函数的代码的剩余块,它起作用了。 对;就像我说的那样。

以上是关于PLS-00103:在 Oracle 11g 中遇到符号“DECLARE”的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - PLS-00103:触发器 - 文件结束错误

PLS-00103:在 oracle 函数中预期以下之一时遇到符号“IF”

PLS-00103 在 Oracle 游标中提供参数时 [重复]

Oracle 错误 PLS-00103

在 Oracle 下创建存储过程时出错 - PLS-00103

oracle程序错误PLS-00103遇到符号“END”[关闭]