Частая ошибка в 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.