web-dev-qa-db-fra.com

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

J'utilise Oracle 10g et toad 11.5. J'essaie d'appeler une API à partir d'un bloc anonyme.

Si je recompile l'api après avoir ajouté dbms_output.put_line puis essayez d'exécuter le bloc anonyme, il affiche l'erreur comme

"ORA-06508: PL/SQL: could not find program unit being called".

Cependant, si je termine la session en cours et ouvre une nouvelle session, le bloc anonyme s'exécutera sans l'erreur.

En raison de ce problème, je suis obligé de reconnecter la session chaque fois que je modifie l'API. Quelqu'un peut-il aider si ce problème peut être résolu en effectuant des configurations au niveau du crapaud ou de la base de données.

13
battech

Je soupçonne que vous ne signalez que la dernière erreur dans 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 paquet est avec état :

Les valeurs des variables, constantes et curseurs qu'un package déclare (dans sa spécification ou son corps) comprennent son état de package . 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 avec état instancié est recompilé (explicitement, avec la "déclaration ALTER PACKAGE", ou implicitement), la prochaine invocation d'un sous-programme dans le package entraîne Oracle Database à ignorer l'état du package existant et déclencher l'exception ORA -04068.

Après que PL/SQL lève l'exception, une référence au package provoque la ré-instanciation du package par Oracle Database, qui le réinitialise ...

Vous ne pouvez pas éviter cela si votre colis a un état. Je pense qu'il est assez rare d'avoir vraiment besoin d'un paquet pour être avec état, donc vous devriez revoir tout ce que vous avez déclaré dans le paquet, mais en dehors d'une fonction ou d'une procédure, pour voir s'il 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).

22
Alex Poole

semble que l'ouverture d'une nouvelle session est la clé.

voir cette réponse.

et voici un super explication de cette erreur

5
mkb

Basé sur les réponses précédentes. J'ai résolu mon problème en supprimant la variable globale au niveau du package dans la procédure, car il n'y avait aucun impact dans mon cas.

Script d'origine était

create or replace PACKAGE BODY APPLICATION_VALIDATION AS 

V_ERROR_NAME varchar2(200) := '';

PROCEDURE  APP_ERROR_X47_VALIDATION (   PROCESS_ID IN VARCHAR2 ) AS BEGIN
     ------ rules for validation... END APP_ERROR_X47_VALIDATION ;

/* Some more code
*/

END APPLICATION_VALIDATION; /

Réécrit le même sans variable globale V_ERROR_NAME et déplacé vers la procédure sous le niveau du package en tant que

Code modifié

create or replace PACKAGE BODY APPLICATION_VALIDATION AS

PROCEDURE  APP_ERROR_X47_VALIDATION (   PROCESS_ID IN VARCHAR2 ) AS

**V_ERROR_NAME varchar2(200) := '';** 

BEGIN
     ------ rules for validation... END APP_ERROR_X47_VALIDATION ;

/* Some more code
*/

END APPLICATION_VALIDATION; /
3
friendmanish

J'ai recompilé la spécification du package, même si le changement ne concernait que le corps du package. Cela a résolu mon problème

0
Brian Sebastian