2011-10-27 40 views
10

Quindi ho eseguito correttamente una procedura PLSQL e la compilazione senza errori. Ho fatto una modifica alla mia procedura, e si compila ancora bene, ma adesso quando l'eseguo, ottengo questo errore:Lo stato esistente dei pacchetti è stato scartato

ERROR at line 1: 
ORA-04068: existing state of packages has been discarded 
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated 
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP" 
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP" 
ORA-06512: at "SCHEMA.XP_ST_002180", line 141 
ORA-06512: at line 1 

Delle idee che cosa questo potrebbe essere? Il cambiamento che ho fatto è stato così insignificante che dubito che possa aver causato questo errore. Grazie in anticipo per il vostro aiuto!

risposta

23

Quando una sessione utilizza un pacchetto, quella sessione mantiene uno stato del pacchetto. Se quel pacchetto viene ricompilato la prossima volta che la stessa sessione fa riferimento al pacchetto, riceverai quell'errore.

Per evitare questo, disconnettere ogni sessione che potrebbe aver utilizzato il pacchetto o fare in modo che la sessione esegua un DBMS_SESSION.RESET_PACKAGE per reimpostare lo stato del pacchetto.

+1

Grazie darreljnz, la soluzione ha funzionato bene per me. Ma all'inizio non ho capito cosa stavi dicendo. Quindi, chiarirò un po 'la tua soluzione per gli altri. Aprire una nuova finestra di test in pl/sql e incollare "Begin sys.dbms_session.reset_package; end;" e premi F9 per eseguirlo e poi apporta le modifiche al tuo pacchetto o ricompilare il pacchetto e ora non riceveremo errori nelle nostre applicazioni –

+1

Inizio migliore di una risposta per questo problema. Sarebbe bello vedere questo portato un po 'oltre per spiegare il problema principale e perché si verifica l'errore. –

+0

@YogeshJindal sembra che tu stia dicendo qualcosa di diverso da darrelinjz. Ha scritto che è necessario eseguire RESET_PACKAGE, in ogni sessione, dopo il cambio di pacchetto per evitare l'errore. – pauloya

4

Se si ricompila una specifica del pacchetto, tutti gli oggetti dipendenti vengono invalidati. Un oggetto dipendente è qualsiasi vista, specifica del pacchetto, corpo del pacchetto, funzione o procedura che fa riferimento a qualsiasi dichiarazione nella specifica del pacchetto ricompilato.

Inoltre, come indicato da darreljnz, le sessioni di solito mantengono i riferimenti allo stato dei pacchetti a cui hanno avuto accesso, causando un ORA-04068: existing state of packages has been discarded la prossima volta che la sessione tenta di fare riferimento al pacchetto.

Quest'ultimo comportamento è una vera seccatura e rende necessario scrivere codice per riprovare operazioni o chiudere tutte le sessioni attive dopo aver installato una nuova versione di un pacchetto (riavviare efficacemente l'applicazione/servizio). Bottom line: rende più difficile installare gli hotfix.

3

Utilizzare pragma serially_reusable nel proprio pacchetto e nel relativo corpo.

+1

cosa fa, perché questa è una soluzione? per favore, elabora – TecHunter

Problemi correlati