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

Итак, я очень хорошо выполнял процедуру 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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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