Частая ошибка в Oracle ORA-04068: существующее состояние пакетов было отклонено - PullRequest
10 голосов
/ 19 ноября 2009

Мы получаем эту ошибку один раз в день в сценарии, который запускается каждые два часа, но в разное время дня.

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "PACKAGE.NAME" has been
invalidated
ORA-06508: PL/SQL: could not find program unit being called:
"PACKAGE.NAME"
ORA-06512: at line 1

Может ли кто-нибудь перечислить, какие условия могут вызвать эту ошибку, чтобы мы могли провести расследование?

Спасибо.

UPDATE: Выполнение 'ALTER SESSION CLOSE DATABASE LINK DBLINK' сделает недействительным состояние пакета?

Ответы [ 5 ]

14 голосов
/ 19 ноября 2009

Пакет имеет открытые или закрытые переменные. (Верно?) Эти переменные формируют состояние пакета. Если вы скомпилируете пакет в 3-й сессии. При следующем доступе к этому пакету выбрасывается ORA-04068.

Метка времени сборки пакета должна быть старше, чем состояние сеанса пакета.

Если состояние пакета не требуется для запуска скрипта, вызовите DBMS_SESSION.RESET_PACKAGE в начале вашего скрипта. Это очищает все состояния пакета вашего сеанса.

13 голосов
/ 15 апреля 2010

Этот лайнер на самом деле решил все:

PRAGMA SERIALLY_REUSABLE;

Убедитесь, что ваши глобальные переменные не сохраняют состояния, чтобы избежать каких-либо проблем.

4 голосов
/ 19 ноября 2009

Вы также можете проверить dba_dependencies или user_dependencies.

select *
from dba_dependencies
where name = 'YOUR_PACKAGE'
and type = 'PACKAGE' --- or 'PACKAGE_BODY'
and owner = USER --- or USERNAME

Это даст вам объекты, от которых зависит ваш пакет. Проверьте, что там происходит.

1 голос
/ 30 июня 2014

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

Мы нашли ниже запрос, который показал разницу во времени в нашем синониме.мы перекомпилировали синоним и все заработало !!!Прошла почти неделя, и пока у нас нет проблем.Вот запрос, который помог в нашем случае.

**

select do.obj# d_obj,do.name d_name, do.type# d_type, po.obj# p_obj,po.name p_name,
to_char(p_timestamp,'DD-MON-YYYY HH24:MI:SS') "P_Timestamp",
to_char(po.stime ,'DD-MON-YYYY HH24:MI:SS') "STIME", 
decode(sign(po.stime-p_timestamp),0,'SAME','*DIFFER*') X 
from sys.obj$ do, sys.dependency$ d, sys.obj$ po
where P_OBJ#=po.obj#(+) and D_OBJ#=do.obj# 
and do.status=1 /*dependent is valid*/ 
and po.status=1 /*parent is valid*/ 
and po.stime!=p_timestamp /*parent timestamp not match*/ 
order by 2,1;

**

Надеюсь, это поможет кому-то, у кого может быть эта проблема.

0 голосов
/ 19 ноября 2009

Кажется, что вы вносите изменения в свои объекты, которые делают другие объекты недействительными. Например, удаление индекса может привести в недопустимое состояние все пакеты, которые зависят от этой таблицы. Может иметь каскадный эффект. Если пакет недействителен, функция, которая зависит от пакета и представления, использующего функцию, может стать недействительной. Попробуйте перекомпилировать все объекты после каждого запроса DDL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...