Существующее состояние пакетов было сброшено

таким образом, я запускаю процедуру 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 ответов


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

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


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

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

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


использовать pragma serially_reusable в пакет и его тело.