Пакет PL / SQL признан недействительным - PullRequest
24 голосов
/ 23 марта 2010

У меня есть скрипт, который использует пакет (PKG_MY_PACKAGE). Я изменю некоторые поля в запросе в этом пакете, а затем перекомпилирую его (я не изменяю и не компилирую другие пакеты). Я запускаю скрипт и получаю ошибку, которая выглядит как

    ORA-04068: existing state of packages has been discarded
    ORA-04061: existing state of package body "USER3.PKG_MY_PACKAGE" has been invalidated
    ORA-04065: not executed, altered or dropped package body "USER3.PKG_MY_PACKAGE"
    ORA-06508: PL/SQL: could not find program unit being called: "USER3.PKG_MY_PACKAGE"
    ORA-06512: at line 34

Я снова запускаю сценарий (не изменяя ничего в системе), и сценарий выполняется успешно.

Я думал, что когда я скомпилировал, я выполнил сценарий, который исправил бы любые недействительные ссылки. Это на 100% воспроизводимо, и чем больше я использую этот скрипт, тем больше он раздражает. Что может вызвать это, и что бы это исправить?

(oracle 10g, с использованием PL / SQL Developer 7)

Ответы [ 4 ]

21 голосов
/ 24 марта 2010

Если вы запускаете что-то в скрипте, попробуйте эти команды там перед запуском перекомпилированного кода ..

exec DBMS_SESSION.RESET_PACKAGE
exec DBMS_SESSION.MODIFY_PACKAGE_STATE( DBMS_SESSION.REINITIALIZE )

Они делают то, что может предложить название.

21 голосов
/ 23 марта 2010

Фон

existing state of packages has been discarded означает, что у вашего Пакета было какое-то состояние.

Это вызвано глобальной переменной, хранящейся в вашем теле пакета.
До 11.2.0.2 константы также вызывали такое поведение (см. документация ).

Поскольку пакет уже использовался в вашем сеансе, Oracle предполагает, что это состояние относится к вам,Некоторые из этих переменных теперь могут иметь разные значения, и когда вы перекомпилируете Body, значения сбрасываются.

Это исключение выдается, чтобы ваши клиенты знали, что они больше не могут полагаться на эти переменные.

Решения

  • Удалите все глобальные переменные и константы (до 11gR2) из тела пакета, если это возможно
  • Замените глобальные переменные функциями DETERMINISTIC (как предложено этим ответом )
  • Определение пакетов с помощью PRAGMA SERIALLY_REUSABLE заставляет Oracle повторно инициализировать глобальные переменные с каждымвызовите сервер.
  • Закройте сеанс и заново подключитесь перед повторным вызовом пакета.
  • Сбросьте состояние вручную (см. ответ Пола Джеймса )
0 голосов
/ 09 июня 2017

Вышеуказанная ошибка: ORA-06508: PL / SQL: не удалось найти вызываемый программный модуль.

вызывается, когда была предпринята попытка вызвать хранимую программу, которая не может быть найдена. Программа может быть удалена или несовместимо изменена или скомпилирована с ошибками.

Убедитесь, что все упомянутые программы, включая их тела пакетов, существуют и совместимы.

Вы можете выполнить этот запрос, чтобы найти недопустимые объекты, что может привести к ошибке ORA-06508:

выберите comp_id, COMP_NAME, версия, статус, Пространство имен, схема от dba_registry;

0 голосов
/ 23 декабря 2016

Возможные проблемы:

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

    выберите * из всех объектов, где status = 'INVALID' и owner = 'SCHEMA_NAME';

  • Проверьте, есть ли в вашем пакете глобальные переменные? если да, то проверьте, не изменяются ли эти переменные в каком-либо другом сеансе, предпочтительно удалите эти глобальные переменные / используйте функцию

  • запустите скрипт ниже, чтобы скомпилировать все объекты в вашей схеме

    начать dbms_utility.compile_schema ( 'SCHEMA_NAME', ложь); конец;

  • Последний вариант, если ничего из вышеперечисленного не работает, затем удалите все процедуры / функции из вашего пакета, добавьте новую функцию и попробуйте запустить вашу функцию из триггера. проверьте, работает ли это, тогда ваша посылка находится в специальной блокировке. После добавления новой функции / proc ее состояние снова будет действительным, а затем вы сможете добавить все свои действительные функции / процедуры и удалить вновь добавленную функцию / proc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...