Існуючий стан пакетів був відхилений

Таким чином, я виконую процедуру 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

Будь-які ідеї, що це може бути? Зроблена зміна була настільки незначною, що я сумніваюся, що це могло спричинити цю помилку. Заздалегідь дякую за вашу допомогу!

10

3 Відповіді

Коли сеанс використовує пакет, цей сеанс зберігає певний стан пакунка. Якщо цей пакет буде перекомпілювати, наступного разу той самий сеанс буде посилатися на пакет, у якому ви отримаєте цю помилку.

Щоб уникнути цього, переконайтеся, що ви відключили кожен сеанс, який, можливо, використовував пакет або мав сеанс DBMS_SESSION.RESET_PACKAGE, щоб скинути стан пакунка.

23
додано
@YogeshJindal, схоже, ви говорите щось інше, ніж darrelinjz. Він написав, що вам потрібно запустити RESET_PACKAGE на кожному сеансі після зміни пакета, щоб уникнути помилки.
додано Автор pauloya, джерело
@YogeshJindal Що я читаю, це означає, що кожен сеанс повинен запустити цю команду, що має сенс після прочитання команди RESET_PACKAGE : " Ця процедура демонтує всі пакети цього сеансу. " Вона не повинна впливати на інші сеанси в базі даних, тому Запуск його з тестового вікна не вплине на інші сеанси.
додано Автор pauloya, джерело
Найкращий початок відповіді на цю проблему. Було б добре бачити, що це відбулося трохи далі, щоб пояснити основне питання і чому помилка виникає.
додано Автор Andrew Martinez, джерело
Спасибі darreljnz, рішення добре працювало для мене. Але спочатку я не зрозумів, чого ти скучив. Отже, я просто намагаюсь уточнити ваше рішення трохи для інших. Відкрийте нове вікно тестування в pl/sql та вставте "Почніть sys.dbms_session.reset_package; end;" і натисніть F9, щоб виконати його, а потім внести зміни в пакет або перекомпілювати пакет, і тепер ми не отримаємо помилок у наших додатках
додано Автор Yogesh Jindal, джерело
@ PauloManuelSantos Я думаю, що він говорить або відключити всі сеанси, або запустити цю команду з сеансу, щоб скинути стан пакунка.
додано Автор Yogesh Jindal, джерело

Якщо ви перекомпілюєте специфікацію пакунка, всі незалежні об'єкти недійсні. Залежним об'єктом є будь-який вигляд, специфікація пакунка, тіло упаковки, функція або процедура, яка посилається на будь-яку декларацію в специфікації пакету перекомпіляції.

Крім того, як зазначив darreljnz, сесії зазвичай зберігають посилання на стан пакетів, до яких вони звернулися, через що наступний раз, коли сеанс намагається посилатись, виникає ORA-04068: існуючий стан пакетів . пакет

Це останнє поведінка є реальною незручностю, і виникає необхідність або написати код для повторення операцій або закрити всі активні сесії після встановлення нової версії пакунка (ефективно перезапустити програму/службу). Підсумок: ускладнює встановлення виправлень.

4
додано

Використовуйте pragma serially_reusable у вашому пакеті та його тілі.

3
додано
що це робить, чому це рішення? будь ласка, роз'ясни
додано Автор TecHunter, джерело