2011-11-02 4 views
2

J'ai une installation Oracle 10G (Oracle Database 10g Édition Entreprise version 10.2.0.3.0 - Prod), et une application web Java qui appelle des procédures stockées et des fonctions dans Oracle via une connexion JDBC. Les SP et les fonctions font partie d'un paquet. La première fois qu'un SP ou une fonction est appelée, après que le package a été compilé avec succès, j'obtiens ces erreurs:Le premier appel à une procédure stockée, après une compilation réussie, échoue. Oracle 10g

(J'ai remplacé notre nom de schéma et nom de package par "# schéma-nom #. # Nom-package #"

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

La prochaine fois qu'elle est appelée, tout fonctionne comme elle le devrait. Des idées sur pourquoi et comment empêcher cela de se produire?

Répondre

4

Ce comportement est normal pour les paquets qui ont l'état, à savoir qu'ils ont des variables du corps . Lorsque le paquet est compilé, l'état existant doit être évité et toutes les sessions qui ont utilisé le paquet avant reçoivent l'erreur ORA-04068 (à l'exception de celle qui a compilé le paquet).

Comme vous avez une application Web, je suppose qu'elle utilise un pool de connexions qui maintient la session active. Donc, ils seront tous affectés s'ils ont déjà utilisé le paquet. Une solution de contournement consiste à appeler DBMS_SESSION.RESET_PACKAGE, qui supprime l'état de tous les packages de la session en cours. ContournementUne autre consiste à vérifier si vous pouvez vous débarrasser de l'état de la session, ce qui est quelque peu problématique en combinaison avec un pool de connexions.

+0

Oui, nous utilisons le regroupement de connexions. Où dois-je appeler DBMS_SESSION.RESET_PACKAGE? – jworrin

+0

Vous devez arrêter tous les accès à la base de données à partir de l'application Web pendant la compilation, puis l'appeler dans chaque session contenue dans le pool de collections. Il peut être plus facile d'actualiser toutes les connexions dans le pool (c'est-à-dire les fermer et en créer un nouveau). – Codo

0

Je ne pense pas qu'il y ait un moyen de contourner cela sans laisser tomber et recréer votre session ..

Jetez un oeil à this

Questions connexes