Существующее состояние пакетов было отброшено
Итак, я очень хорошо выполнял процедуру 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
Я перекомпилировал спецификацию пакета, хотя изменение было только в теле пакета. Это решило мою проблему