Ошибка 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
Ответы
Ответ 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" не определены в спецификации. Это связано с этой разницей между телом и спецификацией.