Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-06508:PL/SQL:impossibile trovare l'unità di programma chiamata

Sospetto che tu stia segnalando solo l'ultimo errore in uno stack come questo:

ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "schema.package" has been invalidated
ORA-04065: not executed, altered or dropped package body "schema.package"
ORA-06508: PL/SQL: could not find program unit being called: "schema.package"

In tal caso, è perché il tuo pacchetto è con stato:

I valori delle variabili, delle costanti e dei cursori dichiarati da un pacchetto (nelle sue specifiche o nel corpo) comprendono il suo stato del pacchetto . Se un pacchetto PL/SQL dichiara almeno una variabile, una costante o un cursore, il pacchetto è stateful; in caso contrario, è apolide .

Quando ricompili lo stato è perso:

Se il corpo di un pacchetto con stato istanziato viene ricompilato (esplicitamente, con l'"istruzione ALTER PACKAGE" o implicitamente), la successiva chiamata di un sottoprogramma nel pacchetto fa sì che Oracle Database scarti lo stato del pacchetto esistente e sollevi l'eccezioneORA-04068.

Dopo che PL/SQL ha sollevato l'eccezione, un riferimento al pacchetto fa sì che Oracle Database istanzia nuovamente il pacchetto, che lo reinizializza...

Non puoi evitarlo se il tuo pacchetto ha lo stato. Penso che sia abbastanza raro avere davvero bisogno di un pacchetto per essere con stato, quindi dovresti rivedere tutto ciò che hai dichiarato nel pacchetto, ma al di fuori di una funzione o procedura, per vedere se è davvero necessario a quel livello. Dato che sei su 10g, ciò include costanti, non solo variabili e cursori.

Ma l'ultimo paragrafo della documentazione citata significa che la prossima volta che fai riferimento al pacchetto nella stessa sessione, non riceverai l'errore e funzionerà normalmente (fino a quando non ricompilirai di nuovo).