PLS-00323 ошибка в оракуле
Я создаю процедуру в пакете. Я обновил спецификацию пакета и затем, когда я обновляю тело пакета, он показывает мне следующую ошибку.
[Ошибка] PLS-00323 (314: 13): PLS-00323: подпрограмма или курсор "INSERT_CUSTOMER_ADDRESS" объявлен в спецификации пакета и должен быть определен в теле пакета
NB. INSERT_CUSTOMER_ADDRESS - это название моей процедуры.
5 ответов
Поскольку я сталкиваюсь с этим много раз, это связано с вашим определением функции / процедуры (я имею в виду имена переменных и их соответствующие типы), если есть переменная, которая находится в теле, а не в спецификации, это вызовет эту ошибку. это распространенная ошибка, не волнуйтесь!
Всегда объявление в спецификации pkg и теле pkg должно быть одинаковым.
Это означает, что процедура / функция, объявленная в спецификации pkg (включая имя процедуры / функции, тип параметра), должна быть точно такой же.
Примечание: когда oracle компилирует pkg для описанного выше случая ошибки, оно не даст вам точную строку no.
Если вы создаете процедуру в спецификации пакета, она должна быть создана \ реализована в теле пакета. Рассматривайте спецификацию вашего пакета как интерфейс, а тело пакета - как его реализацию.
Поскольку чьи-то старые ошибки всегда являются новостью для меня, я добавлю свои 3 цента:
Кто-то удалил их спецификации, но все еще имел тело (нет, я не знаю как), и они "не хотели вводить все это обратно".
Итак, я показал им, как генерировать спецификацию из тела:
- Скопируйте тело на лист.
- Вставьте пустой заголовок над телом с названием пакета.
- Компиляция.
- [Получаете ли вы ошибку или нет,] Щелкните правой кнопкой мыши тело пакета в дереве пакетов и выберите "Синхронизировать спецификацию и тело".
- Выберите объекты для показа в спецификации и нажмите ОК.
- "волшебство происходит"
Только волшебства не произошло - и все стало красным... с ошибками 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;
Измените либо спецификацию, либо тело для точного соответствия.
НТН!