Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-04061 :l'état existant du corps du package PACKAGE.NAME a été invalidé et persiste

Oracle procède ainsi car la recompilation d'un package PL/SQL invalide toutes les variables de session en cours d'utilisation.

Nous ne pouvons pas faire grand-chose pour éviter cela, sauf en utilisant de bonnes pratiques de déploiement. Ne déployez pas de modifications pendant que la base de données est en cours d'utilisation, assurez-vous que toutes les connexions sont correctement déconnectées, etc.

Il y a donc une chose au fond du casier :pragma serially_reusable; . Cette instruction signifie que l'état du package est maintenu pendant la durée d'un seul appel au serveur . Par exemple, si nous avons un bloc PL/SQL qui appelle une procédure SR trois fois, toutes les variables modifiées par cette procédure conserveront la valeur sur les trois appels. Mais la prochaine fois que nous exécuterons le bloc - dans la même session - les variables auront été réinitialisées à leurs valeurs de départ.

Il existe plusieurs limitations au PL/SQL réutilisable en série - par exemple, il ne peut pas être utilisé dans les requêtes SQL. Mais la grande attraction de votre point de vue n'est plus les erreurs ORA-04068 ou ORA-04061. Aucun état de session, rien à invalider.

pragma serially_reusable doit être déclaré au niveau du package, et dans le corps ainsi que la spécification. Vous devez donc être sûr qu'aucune des procédures packagées n'a besoin de conserver son état lors des appels au serveur.