首页 > 解决方案 > PLS-00323:子程序或光标

问题描述

我知道最常见的问题是名称或参数不同。除非我的眼睛真的很糟糕,否则情况并非如此:

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-09-17 更新: 嗯,这很奇怪......我删除了整个代码并再次输入,现在错误消失了。

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

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

标签: plsql

解决方案


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

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

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


推荐阅读