Подтвердить что ты не робот

Ошибка Oracle PLS-00323: подпрограмма или курсор объявлены в спецификации пакета и должны быть определены в корпусе пакета

Может кто-нибудь помочь мне поместить мою процедуру 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
4b9b3361

Ответ 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). Выберите тот или другой.

Ответ 2

"или курсор 'M115_EDIT' объявлен в спецификации пакета и должен быть определен в корпусе пакета"

Я получил эту ошибку, пока я работал над моим проектом. Причина этого была именем параметра, которое внутри процедуры, определенной в теле, не соответствовало соответствующему имени параметра в теле.

моя спецификация:

мое тело

мой параметр market_code отличается в теле по сравнению со спецификацией, где он определяется как sub_market_code.error, возникший из-за этой разницы. я изменил параметр sub_market_code в спецификации на market_code, чтобы он соответствовал телу, и это решило проблему, упомянутую выше.

явно 2 параметра, упомянутых в вашем теле, реализация процедуры "r_date" и "dur" не определены в спецификации. Это связано с этой разницей между телом и спецификацией.