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

ORA-04061:lo stato esistente del corpo del pacchetto PACKAGE.NAME è stato invalidato persiste

Oracle lo fa perché la ricompilazione di un pacchetto PL/SQL invalida tutte le variabili di sessione in uso.

Non c'è molto che possiamo fare per evitarlo, se non utilizzando buone pratiche di distribuzione. Non distribuire le modifiche mentre il database è in uso, assicurati che tutte le connessioni siano disconnesse correttamente, ecc. Più facile a dirsi che a farsi in questa era di CI/CD, zero tempi di inattività e altre entusiasmanti innovazioni.

Quindi c'è una cosa sul retro dell'armadietto:pragma serially_reusable; . Questa istruzione indica che lo stato del pacchetto viene mantenuto per la durata di una singola chiamata al server . Ad esempio, se abbiamo un blocco PL/SQL che chiama una procedura SR tre volte, tutte le variabili modificate da quella procedura manterranno il valore nelle tre chiamate. Ma la prossima volta che eseguiremo il blocco, nella stessa sessione, le variabili saranno state reimpostate sui valori iniziali.

Esistono diverse limitazioni al PL/SQL riutilizzabile in serie, ad esempio, non può essere utilizzato nelle query SQL. Ma la grande attrazione dal tuo punto di vista non sono più gli errori ORA-04068 o ORA-04061. Nessuno stato della sessione, niente da invalidare.

pragma serially_reusable deve essere dichiarato a livello di confezione, e nel corpo così come le specifiche. Quindi devi essere sicuro che nessuna delle procedure pacchettizzate debba mantenere lo stato tra le chiamate al server.