Ошибка PLS-00323 в оракуле

Я создаю процедуру в package. Я обновил спецификацию пакета, а затем, когда я обновляю тело пакета, он показывает мне следующую ошибку.

[Ошибка] PLS-00323 (314: 13): PLS-00323: подпрограмма или курсор «INSERT_CUSTOMER_ADDRESS» объявлены в спецификации пакета и должны быть определены в теле пакета

NB: INSERT_CUSTOMER_ADDRESS — это имя моей процедуры.


person Amit    schedule 21.07.2011    source источник
comment
Это может быть слишком очевидно, но дважды проверьте, точно ли имя процедуры совпадает со всеми параметрами, которые она получает.   -  person Björn    schedule 21.07.2011
comment
Понял, просто в имени параметра пропущена буква.   -  person Amit    schedule 21.07.2011
comment
такая же ошибка здесь около получаса, занимающаяся этим. большое спасибо.   -  person BlaShadow    schedule 11.09.2013
comment
Не забудьте также проверить возвращаемый тип. Вот что меня достало.   -  person BimmerM3    schedule 09.09.2015
comment
Пожалуйста, выберите решение из списка ниже и отметьте его как ответ.   -  person user3454439    schedule 28.07.2017


Ответы (4)


Если вы создаете процедуру в спецификации пакета, она должна быть создана\реализована в теле пакета. Рассматривайте спецификацию пакета как интерфейс, а тело пакета как его реализацию.

person Maxim Shevtsov    schedule 21.07.2011
comment
Да, я добавил код процедуры в тело пакета. Это не причина ошибки. Каким-то образом, когда я обновляю тело процедуры, оно не включает новую процедуру, хотя она находится внутри тела пакета. - person Amit; 21.07.2011
comment
Похоже на странную ошибку. Все в порядке, но он не создается. - person Amit; 21.07.2011

Объявление спецификации пакета и тела пакета всегда должны совпадать.

Это означает, что процедура/функция, объявленная в спецификации pkg (включая имя процедуры/функции, тип параметра), должна быть точно такой же.

Примечание: когда оракул компилирует pkg для вышеуказанного случая ошибки, он не даст вам точный номер строки.

person user3773778    schedule 25.06.2014
comment
Похоже, проблема уже решена в комментариях, и вы просто перефразируете комментарии в этот ответ. - person Robby Cornelissen; 25.06.2014
comment
Примечание полезно! - person user3454439; 28.07.2017

Спецификация : FUNCTION ITEM_ACTIVE(SKU_NUM IN NUMBER) RETURN BOOLEAN;

Текст: FUNCTION ITEM_ACTIVE(P_SKU_NUM IN NUMBER) RETURN BOOLEAN;

Измените либо спецификацию, либо тело, чтобы точно соответствовать.

ХТХ!

person user2723258    schedule 27.08.2013

Поскольку чьи-то старые ошибки для меня всегда новость, добавлю свои 3 копейки:

Кто-то удалил свою спецификацию, но все еще имел тело (нет, я не знаю как), и они «не хотели вводить все это обратно».

Поэтому я показал им, как создать спецификацию из тела:

  1. Скопируйте тело на рабочий лист.
  2. Вставьте пустой заголовок над телом с названием пакета.
  3. Скомпилировать.
  4. [Независимо от того, получили вы ошибку или нет,] Щелкните правой кнопкой мыши тело пакета в дереве пакетов и выберите «Синхронизировать спецификацию и тело».
  5. Выберите объекты для отображения в миникаталоге и нажмите OK.
  6. "волшебство случается"

Только волшебства не произошло -- и все стало красным... с ошибками PLS-00323.

SQL Developer заполняет спецификацию пакета, извлекая заголовки процедур и функций из самого кода, поэтому вам не нужно беспокоиться о таких вещах, как продажа. Он представляет список объектов для добавления в пакет/спецификацию, и вы выбираете, какие из них добавить.

Мы выбрали правильные процедуры и функции, но он скомпилирован с ошибками. Опять таки. И опять.

Оказывается, функции, выбрасывавшие ошибки, были определены в теле пакета с помощью DETERMINISTIC — когда редактор SQL Dev выполнял синхронизацию, он пропустил это слово. Это довольно существенно.

Так или иначе, просмотрели, вставили DETERMINISTIC в конкретные функции перед точкой с запятой, сохранили (перекомпилировали), а потом снова волшебство.

Вы ожидаете, что SQL Developer выполнит всю работу, а не половину... работы.

person Marc    schedule 30.06.2015