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

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

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

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

спасибо.

обновление: Бы выполнения 'ALTER SESSION CLOSE DATABASE LINK DBLINK' аннулировать состояние пакета?

5 ответов


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

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

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


этот один лайнер фактически решил все:

PRAGMA SERIALLY_REUSABLE;

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


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

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

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


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

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

**

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;

**

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


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