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

Sql*_*oob 18 sql oracle plsql stored-procedures packages

有人可以帮我把我的pl/sql程序放在一个包中吗?我试过了,我正在努力:

这就是我的包装规格:

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

--
Run Code Online (Sandbox Code Playgroud)

这是我的包体,我遇到了问题:

  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;
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮我修复错误,我会很感激:

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

Stu*_*tLC 36

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

在标题中,您有:

PROCEDURE get_films(fname VARCHAR2);
Run Code Online (Sandbox Code Playgroud)

而在身体:

PROCEDURE get_films(fname IN film.title%type, 
   r_date OUT film.release_date%type, dur OUT film.duration%type)
Run Code Online (Sandbox Code Playgroud)

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

总结一下

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