Существующее состояние пакетов было отклонено - PullRequest
14 голосов
/ 27 октября 2011

Итак, я прекрасно выполняю процедуру PLSQL и компилирую без ошибок. Я сделал одно изменение в своей процедуре, и он все еще прекрасно компилируется, но теперь, когда я запускаю его, я получаю эту ошибку:

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

Есть идеи, что это может быть? Внесенное мной изменение было настолько незначительным, что я сомневаюсь, что это могло вызвать эту ошибку. Заранее благодарю за помощь!

Ответы [ 3 ]

25 голосов
/ 28 октября 2011

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

Чтобы избежать этого, убедитесь, что вы отключаете каждый сеанс, который мог использовать пакет, или сеанс выполняет DBMS_SESSION.RESET_PACKAGE для сброса состояния пакета.

4 голосов
/ 28 октября 2011

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

Кроме того, как указывает darreljnz, сеансы обычно сохраняют ссылки на состояние пакетов, к которым они получили доступ, вызывая ORA-04068: existing state of packages has been discarded в следующий раз, когда сеанс пытается обратиться к пакету.

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

3 голосов
/ 17 октября 2013

Используйте pragma serially_reusable в вашем пакете и его теле.

...