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

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

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

NB. INSERT_CUSTOMER_ADDRESS - это название моей процедуры.

5 ответов

Поскольку я сталкиваюсь с этим много раз, это связано с вашим определением функции / процедуры (я имею в виду имена переменных и их соответствующие типы), если есть переменная, которая находится в теле, а не в спецификации, это вызовет эту ошибку. это распространенная ошибка, не волнуйтесь!

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

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

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

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

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

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

Итак, я показал им, как генерировать спецификацию из тела:

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

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

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

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

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

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

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

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

Тело: FUNCTION ITEM_ACTIVE (P_SKU_NUM IN NUMBER) RETURN BOOLEAN;

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

НТН!

Другие вопросы по тегам