【问题标题】:PLS-00323: subprogram or cursorPLS-00323:子程序或光标
【发布时间】:2019-02-19 04:55:05
【问题描述】:

我知道最常见的问题是名称或参数不同。 除非我的眼睛真的很差,否则这里不是这样:

CREATE OR REPLACE PACKAGE my_api IS
  PROCEDURE sync_batch(x_return_status      OUT VARCHAR2);
END my_api;
/

CREATE OR REPLACE PACKAGE BODY my_api IS
  PROCEDURE sync_batch(x_return_status      OUT VARCHAR2) IS
  BEGIN
    x_return_status := 'test';
  END sync_batch;
END my_api;
/

这会导致:

PACKAGE BODY MY_API 的错误:PLS-00323:子程序或游标“SYNC_BATCH”在包规范中声明,并且必须在包主体中定义。

当我在测试环境中使用 sqlplus 11.2.0.1.0 64 位连接到 12.1.0.2.0 64 位数据库时会发生这种情况。 当我使用 sqlplus 11.2.0.1.0 连接到我们客户的 11.2.0.1.0 64 位数据库时,它不会发生。 我可以添加更多程序,但是这个 sync_batch 程序总是会出现错误。重命名程序也不能解决问题,所以我认为它不是保留名称。

有人知道还有什么可能导致这种情况吗?

2018 年 9 月 17 日更新: 嗯,这很奇怪......我删除了整个代码并再次输入,现在错误消失了。

当我在完整代码中执行相同操作时,该过程的错误消失了 - 但在更下方的过程中再次出现,不是直接下一个,而是之后的一个。

我在 Visual Studio 2017 中的 .sql 文件中输入了它,在我重新输入之前和之后,我都从那里复制了代码以在 SQLPlus 中执行。会不会是一些编码问题? VS 说带有签名的 UTF-8,代码页 65001,行尾 = 当前设置。我的 Oracle 数据库使用 NLS_CHARACTERSET = WE8MSWIN1252

【问题讨论】:

  • 您的规范似乎没有正确编译。
  • 一般不会这么说吧?就像我说的,同样的代码在另一个数据库上也能正常工作。

标签: plsql


【解决方案1】:

刚刚尝试使用您提供的确切脚本创建包和包体。通过 IDE 和 SQLPlus 创建和编译成功(但是,我使用了 12* 版本的 SQLPlus)。

您是否以正确的顺序创建包对象 - 首先是标题,然后是正文? 当您创建带有编译错误的包然后尝试重新编译它时会发生什么?这没有帮助吗?

我知道SQLPlus在脚本中有空行的问题,所以通过SQLPlus执行脚本的时候一定不要有空行。

【讨论】:

  • SQL*Plus 可以在 PL/SQL 中处理空行,它只是 SQL 中的空行,您必须小心处理(例如,通过设置 sqlblanklines on)。
  • 正如我在更新中所述,编码或某些“不可见”字符可能存在问题。但是我从来没有遇到过将一个语句/过程与另一个分开的空行问题。我不知道一个语句/程序中的空行有问题,会留意这一点
【解决方案2】:

与您的版本相同:

  • 客户端 11.2.0.1.0
  • 数据库 12.1.0.2.0 64 位

工作正常。所以……不知道。当然,这是一个愚蠢的建议,但是 - 你能退回数据库吗?


M:\>sqlplus scott@orcl

SQL*Plus: Release 11.2.0.1.0 Production on Pet Ruj 14 13:50:04 2018

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> set linesize 200
SQL> SELECT * FROM v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production              0
PL/SQL Release 12.1.0.2.0 - Production                                                    0
CORE    12.1.0.2.0      Production                                                        0
TNS for Linux: Version 12.1.0.2.0 - Production                                            0
NLSRTL Version 12.1.0.2.0 - Production                                                    0

SQL> CREATE OR REPLACE PACKAGE my_api
  2  IS
  3     PROCEDURE sync_batch (x_return_status OUT VARCHAR2);
  4  END my_api;
  5  /

Package created.

SQL> CREATE OR REPLACE PACKAGE BODY my_api
  2  IS
  3     PROCEDURE sync_batch (x_return_status OUT VARCHAR2)
  4     IS
  5     BEGIN
  6        x_return_status := 'test';
  7     END sync_batch;
  8  END my_api;
  9  /

Package body created.

SQL>
SQL> DROP PACKAGE my_api;

Package dropped.

SQL>

【讨论】:

  • 不是在周末之前。我试试看。
猜你喜欢
  • 2021-08-11
  • 2020-04-17
  • 2014-12-18
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多