Question

Le scénario qui a créé cette question:

Nous avons un package qui dépend d'un autre package, apportant parfois des modifications au paramètre "parent". package rend le package dépendant invalide, mais parfois non.

Cela nous a déjà pris par surprise auparavant.

Il serait très utile de simplement comprendre les causes de l’invalidation pour que je puisse le prévoir / le planifier.

Était-ce utile?

La solution

La modification de tout objet sur lequel un package repose (par exemple, tables, vues, déclencheurs, autres packages) marquera automatiquement le package comme non valide. Comme tuinstoel le remarque ci-dessus, Oracle est suffisamment intelligent pour recompiler le package lors de sa première utilisation.

Si cela vous intéresse, chaque fois que vous apportez des modifications au schéma (tables, vues, déclencheurs, procédures, par exemple), exécutez un DBMS_UTILITY.compile_schema (ou demandez à votre administrateur de base de données de le faire). Cela forcera la compilation de tous les paquets et vous permettra de savoir où, ou si, il y a des erreurs avant de les trouver à la dure.

Autres conseils

Vous pouvez également interroger le tableau ci-dessous pour connaître vos dépendances

.
   select *
   from dba_dependencies
   where name = 'YOUR_PACKAGE'
   and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself
   and owner = USER --- Or can be set to any user

Ceci affichera toutes les dépendances. Pour vos objets, interrogez user_dependencies.

BTW, si je me trompe complètement au sujet de la situation ... veuillez nous excuser par avance

Pris au dépourvu?

Je ne suis pas sûr de ce que les implications de cela sont ...

Quelque chose a cassé dans la production?

Que s'est-il exactement passé?

La raison pour laquelle je pose cette question est parce que comprendre les ramifications de tous les changements possibles est beaucoup plus difficile que de traiter des résultats. Pourquoi l'invalidation devient un problème? J’imagine que c’est parce que vous avez un " L’état actuel du paquet a été jeté " erreur dans votre application. Est-ce le problème REAL ?

Encore une fois, je le soupçonne et, le cas échéant, abordons-le au lieu de la liste des modifications qui, comme je le fais dans un commentaire, sont spécifiques à la version. (11g suit la dépendance dans la colonne d’une table au lieu de la table dans son ensemble, par exemple).

Cela peut ne pas sembler être une erreur importante pour vous si vous n'utilisez pas l'état du package. Si vous étiez là, ce serait une erreur importante et vous n’auriez pas été surpris, alors je suppose que ce n’est pas le cas.

Puisque vous n'êtes pas cette erreur est ok pour ignorer. Comme vous pouvez l'ignorer en toute sécurité, vous pouvez autoriser votre application client à ignorer cette erreur et à réessayer votre appel, car, comme d'autres l'ont déjà indiqué, Oracle recompilera votre package pour vous. C'est un exercice qui en vaut la peine. Parce que plutôt que de savoir tout ce dont vous devez vous inquiéter lorsque vous apportez un changement, puis, en cas d'urgence, vous oubliez un de ceux-ci, votre application va le gérer et passer à autre chose, sans souci.

Je suis d'accord avec Thomas Jones-Low, mais il reste quelques problèmes supplémentaires liés aux longues sessions et à la recompilation.

Si vous faites référence à un package dans une session et que ce dernier (ou un package dépendant) est recompilé au cours de la même session, vous obtiendrez une erreur oracle "ORA-06508: PL / SQL: l'unité de programme n'a pas pu être appelée" ;

Une fois que vous avez référencé le package dans une session, vous ne pouvez généralement pas le modifier sans l'invalider pour cette session. Il s'agit d'un problème particulier pour les environnements de développement où les packages changent fréquemment, mais également pour les environnements de production dans lesquels vous souhaitez effectuer un petit correctif sans supprimer l'environnement complet. Notez que cette erreur se produira même s’il n’ya pas d’erreur dans les packages modifiés.

En plus de la réponse de Thomas Jones-Low, si vous ne modifiez que le package BODY, un objet dépendant risque de ne pas être marqué comme non valide.

Cependant, dès que vous modifiez la spécification du package, cela est inévitable.

Si vous essayez d'exécuter un package Oracle non valide, Oracle tentera de le compiler. Ce n'est que lorsqu'il reste invalide après la compilation que Oracle lève une exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top