2014-10-30 4 views
7

im ottenendo sotto l'errore quando nel tentativo di eseguire procedure" PROCEDURE_NAME "nell'ambito della procedura" CALLING_PROCEDURE_NAME" Ma il mio procedure_name. è già in stato valido e con successo utilizzando in alcune altre procedure."ORA-04068: lo stato attuale di pacchetti è stata scartata ORA-04.065: non eseguita, modificato o eliminato stored procedure

ORA-04068: existing state of packages has been discarded 
ORA-04065: not executed, altered or dropped stored procedure ""PROCEDURE_NAME"" 
ORA-06508: PL/SQL: could not find program unit being called: ""PROCEDURE_NAME"" 
ORA-06512: at ""CALLING_PROCEDURE_NAME"", line LINE_NO 
ORA-06512: at line 1 
+0

è necessario ricompilare il proc/package – Thomas

+0

@Thomas: no, in questo caso è perché la sessione ha avuto uno stato pacchetto che è stato eliminato quando il pacchetto è stato ricompilato. –

risposta

10

Ma la mia procedure_name è già in stato valido e con successo utilizzando in alcune altre procedure.

La sessione in cui viene attualmente chiamato il pacchetto, mantiene lo stato del pacchetto. Se ricompilate il pacchetto, nel momento in cui il pacchetto viene chiamato di nuovo in quella sessione, arriverete a questo errore.

  1. È possibile eseguire DBMS_SESSION.RESET_PACKAGE; di liberare la memoria, cursori, e le variabili del pacchetto dopo la chiamata PL/SQL che ha reso l'invocazione termina l'esecuzione.

  2. È possibile chiudere tutte le sessioni esistenti e rieseguire.

  3. È possibile creare il pacchetto, SERIALLY_REUSABLE Packages utilizzando la dichiarazione PRAGMA SERIALLY_REUSABLE;. Se un pacchetto è SERIALLY_REUSABLE, lo stato del pacchetto viene memorizzato in un'area di lavoro in un piccolo pool nell'area globale di sistema (SGA). Lo stato del pacchetto persiste solo per la durata di una chiamata al server.

+1

Attenzione alle implicazioni di rendimento di queste varie opzioni; se il tuo pacchetto è invocato molto, l'opzione 3 potrebbe essere una cattiva idea. –

Problemi correlati