【问题标题】:PLS-00323 error in oracle甲骨文中的 PLS-00323 错误
【发布时间】:2011-10-10 02:20:15
【问题描述】:

我正在一个包中创建一个过程。我已经更新了包的规范,然后当我更新包的主体时,它会显示以下错误。

[错误] PLS-00323 (314: 13): PLS-00323: 子程序或游标“INSERT_CUSTOMER_ADDRESS”在包规范中声明,必须在包主体中定义

注意:INSERT_CUSTOMER_ADDRESS 是我的过程名称。

【问题讨论】:

  • 可能太明显了,但请仔细检查过程名称是否完全相同,以及它接收的所有参数。
  • 知道了,只是参数名称中少了一个字母。
  • 同样的错误在这里大约半小时处理。非常感谢。
  • 别忘了检查返回类型。这就是吸引我的原因。
  • 请从下面选择一个解决方案并标记为答案。

标签: plsql oracle10g


【解决方案1】:

如果您在包规范中创建一个过程,则它必须在包主体中创建\实现。将您的包规范视为接口,将包主体视为其实现。

【讨论】:

  • 是的,我已经在包体中添加了程序代码。这不是错误的原因。不知何故,当我更新过程主体时,它不包含新过程,尽管它在包主体内。
  • 这似乎是一个奇怪的错误。一切都很好,但它仍然没有创建。
【解决方案2】:

pkg 规范和 pkg 正文上的声明始终应相同。

这意味着 pkg 规范中声明的过程/函数(包括过程/函数的名称,参数类型)应该完全相同。

注意:当 oracle 为上述错误情况编译 pkg 时,它不会给你确切的行号。

【讨论】:

  • 看起来问题已经在 cmets 中解决了,而您只是将 cmets 重新散列到这个答案中。
  • 注意很有用!
【解决方案3】:

规范:FUNCTION ITEM_ACTIVE(SKU_NUM IN NUMBER) RETURN BOOLEAN;

正文:FUNCTION ITEM_ACTIVE(P_SKU_NUM IN NUMBER) 返回布尔值;

更改规范或正文以完全匹配。

HTH!

【讨论】:

    【解决方案4】:

    因为某人的旧错误对我来说总是新闻,所以我会加我的 3 美分:

    有人删除了他们的规范,但仍然有正文(不,我不知道如何)并且他们“不想重新输入所有内容”。

    所以我向他们展示了如何从正文生成规范:

    1. 将正文复制到工作表中。
    2. 在正文上方插入一个带有包名的空标题。
    3. 编译。
    4. [无论是否报错]在Packages树中右击包体,选择“Synchronize Specification and Body”。
    5. 选择要在规范中公开的对象,然后单击“确定”。
    6. “奇迹发生了”

    只有魔法没有发生——一切都变红了……出现 PLS-00323 错误。

    SQL Developer 通过从代码本身中提取过程和函数头来填充包规范,因此您不必担心销售方面的问题。它提供了要添加到包/规范中的对象列表,您可以选择要添加的对象。

    我们选择了正确的程序和函数,但编译时出错。再次。再说一遍。

    事实证明,引发错误的函数是在包体中用 DETERMINISTIC 定义的——当 SQL Dev 的编辑器进行同步时,它遗漏了这个词。这是相当重要的。

    不管怎样,回顾一下,在分号前的具体函数中粘贴DETERMINISTIC,保存(重新编译),然后又变魔术了。

    您会期望 SQL Developer 完成全部工作,而不是半...工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多