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

ORA-06508 :PL/SQL :impossible de trouver l'unité de programme appelée

Je suppose que vous ne signalez que la dernière erreur d'une pile comme celle-ci :

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"

Si c'est le cas, c'est parce que votre package est avec état :

Les valeurs des variables, des constantes et des curseurs qu'un package déclare (dans sa spécification ou son corps) comprennent son packagestate . Si un package PL/SQL déclare au moins une variable, une constante ou un curseur, alors le package est avec état; sinon, il est sans état .

Lorsque vous recompilez l'état est perdu :

Si le corps d'un package instancié avec état est recompilé (explicitement, avec l'"instruction ALTER PACKAGE", ou implicitement), l'invocation suivante d'un sous-programme dans le package oblige Oracle Database à supprimer l'état du package existant et à déclencher l'exceptionORA-04068.

Une fois que PL/SQL a déclenché l'exception, une référence au package oblige Oracle Database à réinstancier le package, ce qui le réinitialise...

Vous ne pouvez pas éviter cela si votre paquet a un état. Je pense qu'il est assez rare d'avoir vraiment besoin qu'un package soit avec état, vous devriez donc revoir tout ce que vous avez déclaré dans le package, mais en dehors d'une fonction ou d'une procédure, pour voir si c'est vraiment nécessaire à ce niveau. Puisque vous êtes sur 10g, cela inclut les constantes, pas seulement les variables et les curseurs.

Mais le dernier paragraphe de la documentation citée signifie que la prochaine fois que vous référencerez le package dans la même session, vous n'obtiendrez pas l'erreur et cela fonctionnera normalement (jusqu'à ce que vous recompiliez à nouveau).