2009-11-19 11 views
8

Stiamo ottenendo questo errore una volta al giorno su uno script che viene eseguito ogni due ore, ma in diversi momenti della giornata.errore frequente in Oracle ORA-04068: esistenti stato di pacchetti è stata scartata

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 

Qualcuno potrebbe elencare quali condizioni possono causare questo errore in modo da poter indagare?

Grazie.

AGGIORNAMENTO: L'esecuzione di 'ALTER SESSION CLOSE DATABASE LINK DBLINK' invaliderebbe uno stato del pacchetto?

+0

Proprio come un'ulteriore informazione, la compilazione del corpo del pacchetto non rende "invalidi" i pacchetti di chiamata, ovvero il dizionario dei dati mostra ancora tutti i pacchetti e gli attivatori e qualsiasi cosa come "VALID". La cosa che non funziona è il PGA di ciascun utente. Quindi, se ci sono dieci utenti che usano il pacchetto mentre è ricompilato, ognuno colpirà questo problema a sua volta la volta successiva che fanno riferimento a quel pacchetto. –

risposta

12

Questo uno di linea tutto in realtà risolto:

PRAGMA SERIALLY_REUSABLE; 

Assicurarsi che le variabili globali sono apolidi per evitare eventuali problemi.

+6

per essere più precisi, questo pragma fa sì che lo stato del pacchetto sia ripristinato su ogni richiesta al database (l'inizializzazione del pacchetto viene eseguita di nuovo). –

12

Il pacchetto contiene variabili pubbliche o private. (Giusto?) Queste variabili formano lo stato a il pacchetto. Se si compila il pacchetto in 3a sessione. Il prossimo accesso a questo pacchetto lancerà l'ORA-04068.

Il timestamp di compilazione di un pacchetto deve essere di età superiore lo stato della sessione pacchetto.

Se lo stato di pacchetto non è necessario per l'esecuzione di script, la chiamata DBMS_SESSION.RESET_PACKAGE all'inizio del vostro script. Questo pulisce tutti gli stati del pacchetto della tua sessione.

+0

Proverà la chiamata specificata. Grazie. – jonasespelita

+0

Una domanda però, in che modo la compilazione di un pacchetto nella terza sessione lo invalida? – jonasespelita

+2

martilyo: la nuova versione del pacchetto potrebbe avere più/meno/altre variabili del pacchetto. Infatti, se si compila un pacchetto che non ha alcuna variabile del pacchetto, questi errori ORA-04068 non si verificano. I temerari lo fanno sui sistemi di produzione, durante le ore di lavoro impegnate .. –

0

Sembra che si apportano modifiche agli oggetti che fanno gli altri oggetti non validi. La caduta di un indice, ad esempio, può mettere in uno stato non valido tutti i pacchetti che dipendono da quella tabella. Può avere un effetto a cascata. Se il pacchetto non è valido, la funzione che dipende dal pacchetto e dalla vista che utilizza la funzione può diventare non valida. Prova a ricompilare tutti gli oggetti dopo ogni query DDL.

4

Si può anche controllare dba_dependencies o user_dependencies.

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

Ciò fornirà gli oggetti da cui dipende il pacchetto. Controlla cosa sta succedendo lì.

+0

Grazie per le informazioni. Impari qualcosa ogni giorno :). – jonasespelita

1

Abbiamo riscontrato questo problema per un paio di volte e, per ora, stavamo compilando uno schema per risolvere temporaneamente questo problema. In un paio di giorni stavamo cercando la risoluzione permanente.

Abbiamo trovato al di sotto di query che ha mostrato differenze timestamp nel nostro sinonimo. abbiamo ricompilato il sinonimo e ha funzionato !!! È passata quasi una settimana e finora non abbiamo avuto problemi. Ecco la query che ha aiutato nel nostro caso.

**

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; 

**

Spero che questo aiuta qualcuno che potrebbe essere avere questo problema.

Problemi correlati