Oracle 错误 PLS-00323:子程序或游标在包规范中声明,必须在包主体中定义

Posted

技术标签:

【中文标题】Oracle 错误 PLS-00323:子程序或游标在包规范中声明,必须在包主体中定义【英文标题】:Oracle Error PLS-00323: subprogram or cursor is declared in a package specification and must be defined in the package body 【发布时间】:2014-12-18 22:49:08 【问题描述】:

有人可以帮我把我的 pl/sql 程序放在一个包中吗?我已经尝试过,但我正在苦苦挣扎:

这是我所拥有的,用于我的包规范:

CREATE OR REPLACE PACKAGE film_pkg
IS
title VARCHAR2(100);
PROCEDURE get_films(fname VARCHAR2);
END film_pkg;

--

这是我遇到问题的包体:

  CREATE OR REPLACE PACKAGE BODY film_pkg
IS
   PROCEDURE get_films (fname    IN     film.title%TYPE,
                        r_date      OUT film.release_date%TYPE,
                        dur         OUT film.duration%TYPE)
   AS
   BEGIN
      SELECT release_date, duration
        INTO r_date, dur
        FROM FILM
       WHERE title = fname;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         r_date := '';
         dur := '';
   END get_films;
END film_pkg;

如果有人能帮我解决错误,我将不胜感激:

Error(4,11): PLS-00323: subprogram or cursor 'GET_FILMS' is declared in a package specification and must be defined in the package body

【问题讨论】:

【参考方案1】:

您的标头和正文过程定义不匹配

在标题中,您有:

PROCEDURE get_films(fname VARCHAR2);

而在体内:

PROCEDURE get_films(fname IN film.title%type, 
   r_date OUT film.release_date%type, dur OUT film.duration%type)

您可能只需要使用两个额外的 OUT 参数来更新标头定义?

总结

确保标头定义匹配主体实现的所有参数(参数数量、参数名称、参数顺序和参数类型) 根据 Alex 的评论,不要将自定义类型 (film.title%type) 与基本类型 (VARCHAR2) 混合匹配。任选其一。

【讨论】:

当我尝试在 pkg 正文中得到错误时:Error(4,11): PLS-00323: subprogram or cursor 'GET_FILMS' is declared in a package specification and must be defined in the包体 @SqlNoob - %type 很好,但是你必须使用完全相同的声明,即使你知道它们是相同的也不能混搭;您是否也制定了规范fname IN film.title%type,还是将其保留为varchar?整个声明必须相同。 (而且你不能指定参数的大小,所以varchar2(50 byte) 会导致错误)。 另外,请记住重新编译包头,我正在为此苦苦挣扎,因为我更改了过程定义以添加错误代码并且我忘记重新编译包头。【参考方案2】:

“子程序或光标'M115_EDIT'在包规范中声明,必须在包体中定义”

我在处理项目时遇到此错误。原因是正文中定义的过程中的参数名称与正文中的相应参数名称不匹配。

my specification:

my body

与定义为 sub_market_code 的规范相比,我的 market_code 参数在正文中是不同的。由于这种差异而发生了错误。 我将规范中的 sub_market_code 参数更改为 market_code 以使其与正文匹配,从而解决了上述问题。

很明显,规范中没有定义过程“r_date”和“dur”的主体实现中提到的2个参数。错误是由于主体和规范之间的差异造成的。

【讨论】:

【参考方案3】:

参数名称在主体中定义的过程中与主体中相应的参数名称不匹配。”

【讨论】:

以上是关于Oracle 错误 PLS-00323:子程序或游标在包规范中声明,必须在包主体中定义的主要内容,如果未能解决你的问题,请参考以下文章

Oracle12C的安装错误

就是关于oracle的 无监听程序的错误 监听已经开了

无法加载文件或程序集“Oracle.DataAccess 错误

为啥安装oracle11g的时候总是应用程序错误

限制 Oracle 创建编译错误程序

Oracle 10g 程序编译错误