J'essaie de créer une liste des dépendances de package PL / SQL afin que je puisse vous aider à configurer un script de construction automatisé pour que mes packages puissent exécuter sur le serveur de test. Existe-t-il un moyen de commencer avec un seul paquet (un package "racine" identifié par son nom, idéalement), puis de trouver toutes les dépendances et la commande qu'ils doivent être compilées? Les dépendances sont déjà complètement résolues dans mon schéma personnel (au moins au moins j'ai quelque part pour commencer - mais où est-ce que je vais aller ensuite?).
(Oracle 10.2) P>
STRUT> EDIT: FORT > p>
L'outil de construction utilisée utilisera la commande de construction et récupérera ces fichiers dans l'ordre du contrôle de la source, puis transmettez-les à Oracle pour compiler (l'outil de construction actuel est écrit en python ou Java ou les deux - je n'ai pas accès à la source). Fondamentalement, l'outil de construction a besoin d'une liste de fichiers à compiler dans l'ordre dans lequel elles doivent être compilées dans em> et d'accéder à ces fichiers du contrôle de la source. Si cela le fait, tout fonctionnera assez bien. P> EDIT: strong> p> Merci pour les scripts soignés. Malheureusement, le processus de construction est surtout hors de mes mains. Le processus est basé sur un outil de construction construit par le fournisseur du produit que nous intégrons, c'est pourquoi les seules entrées que je peux donner au processus de construction sont une liste de fichiers dans l'ordre dans lequel elles doivent être intégrées. S'il y a une erreur de compilateur, l'outil de construction échoue, nous devons soumettre manuellement une demande de nouvelle construction. Donc, une liste de fichiers dans l'ordre dans lequel ils doivent être compilés sont importants. P> edit: stry> p> trouvé ceci: EDIT: STRUT> (avec code!) P> < p> Je sais qu'en général, ce genre de chose n'est pas nécessaire pour Oracle, mais pour tous ceux qui sont toujours intéressés ... p> J'ai pavé ensemble un petit script qui semble pouvoir obtenir une construction commande de telle sorte que tous les packages soient construits dans le bon ordre sans erreurs liées à la dépendance (par rapport aux pacues) la première fois: p> Je sais que ce n'est pas la plus belle code (globaux partout, etc ... Ugh), et je le répandrai probablement si je peux avoir une chance cet après-midi de la nettoyer, mais en ce moment, il produit un ordre de construction qui semble courir le premier temps sans problèmes. p> une dernière chose, l'objet spécifié par Mise à jour: strong> Je viens de découvrir : objet_name code> doit être l'objet racine que vous souhaitez retrouver toutes les dépendances et créer une commande de. Pour moi, il s'agit d'un colis principal avec une seule méthode qui est le point d'entrée au reste du système. P>
: objet_type code> J'ai principalement limité au corps de paquet
code>, mais cela ne devrait pas être trop de travail pour inclure d'autres types, tels que des déclencheurs. p>
: objet_name code> n'apparaît pas Dans la sortie, cela devrait être le dernier élément, vous devrez donc ajouter cela à votre liste de construction manuellement. p>
user_depends < / code> et
all_dependances code>, ce code pourrait probablement être beaucoup plus simple maintenant. p> p>
7 Réponses :
Regardez le script suivant de http: //www.oracle-base .Com / Articles / misc / recompilatinvalidschemaObject.php
SET SERVEROUTPUT ON SIZE 1000000 BEGIN FOR cur_rec IN (SELECT owner, object_name, object_type, DECODE(object_type, 'PACKAGE', 1, 'PACKAGE BODY', 2, 2) AS recompile_order FROM dba_objects WHERE object_type IN ('PACKAGE', 'PACKAGE BODY') AND status != 'VALID' ORDER BY 4) LOOP BEGIN IF cur_rec.object_type = 'PACKAGE' THEN EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || ' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE'; ElSE EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE BODY'; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner || ' : ' || cur_rec.object_name); END; END LOOP; END; /
Intéressant, mais je ne suis pas sûr que cela fournira une commande de construction réelle.
Vous n'avez pas besoin d'une commande de construction - il suffit de créer les packages avec "Créer ou remplacer ..." sur une base de fichier par fichier, puis compilez-les dans une boucle imbriquée à deux niveaux - chaque passage dans l'intérieur La boucle compile tout ce qui est toujours invalide et la boucle extérieure est utilisée pour vérifier le nombre d'objets non valides et définir une sorte de seuil pour des exécutions maximales de la boucle interne. En pratique, je n'ai jamais vu que le nombre de passes nécessaires soit plus élevé que trois.
Si vous avez plusieurs schémas impliqués dans les dépendances, examinez le script d'oracles utlrp.sql, qui fonctionne à travers les schémas et met en place une infrastructure à gérer le processus - cela nécessite un compte privilégié cependant. P>
De plus, si vous étendez votre commande source pour inclure des vues, assurez-vous que les scripts utilisent "Créer ou remplacer la vue de la force ..." pour créer des vues qui avoir des dépendances non satisfaites au moment de leur création. p>
exemple de script que j'utilise: p>
Si vous traitez vraiment des paquets PL / SQL, vous n'avez pas besoin de transpirer la commande de construction. Il suffit de construire toutes les spécifications de l'emballage en premier. Ensuite, vous pouvez déployer tous les corps de paquet et compilera, car leurs dépendances sont les spécifications de package.
Si vous avez des spécifications de package qui dépendent d'autres spécifications - si vous avez des packages qui déclarent, disons, constantes, Les sous-types ou les curseurs REF utilisables dans les signatures des procédures emballées - alors vous devez créer d'abord ces spécifications de package. Mais il devrait y avoir assez assez d'eux que vous pouvez les organiser dans le script de construction à la main. P>
Modifier strong> P> On dirait qu'ils vont faire
construit incrémental et «propre-balayage»,
donc l'ordre de construction comptera le plus
pour quand ils nettoient le
Environnement et reconstruisez-le. P>
blockQuote> qui ne modifie rien. P> Voici un exemple prolongé. J'ai un schéma avec trois paquets .... p> La chose intéressante est qu'une procédure de PKG1 appelle une procédure de PKG2, une procédure dans PKG2 appelle une procédure de PKG3 et une procédure dans PKG3 appelle une procédure de PKG1. P> q. strong> Comment fonctionne cette dépendance circulaire? Tous les objets dépendants sont les corps de package, tous les objets référencés sont les spécifications emballées. . Par conséquent, si je trash'n'reebuild le schéma, cela n'a pas vraiment d'importance de l'ordre que j'utilise. D'abord, nous détruisons ... p> alors nous reconstruisons ... p> L'ordre des objets individuels est hors de propos . Il suffit de construire les spécifications de package avant les organes de colis. Bien que même cela ne comporte pas vraiment ... p>
a. strong> Ce n'est pas une dépendance circulaire .... p> pkg4 code> n'est pas valide parce que nous n'avons pas construit
constantes_pkg code>. P>
SQL> create or replace package constants_pkg is
2 whatever constant varchar2(20) := 'WHATEVER';
3 end constants_pkg;
4 /
Package created.
SQL> select object_name, object_type, status
2 from user_objects
3 where status != 'VALID'
4 order by 1, 2
5 /
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- -------
PKG4 PACKAGE BODY INVALID
SQL>
SQL> set serveroutput on size unlimited
SQL> exec pkg4.p7
PKG4.P7::WHATEVER
PL/SQL procedure successfully completed.
SQL> select object_name, object_type, status
2 from user_objects
3 where status != 'VALID'
4 order by 1, 2
5 /
no rows selected
SQL>
J'ai commencé à faire cela à la main et j'ai compris que nous devrions continuer à le faire, car le projet progresse et de nouveaux packages sont ajoutés (et il y aura de nouveaux forfaits, probablement à la fin du printemps - j'aimerais avoir quelque chose d'automatisé avant alors ).
Par tous signifie automatiser la construction. Mais si vous ajoutez un colis maintenant, il vous suffit de l'ajouter à la fin du script de construction. L'ordre de dépendance n'a pas d'importance avec des packages.
S'ils construisaient progressivement le code, je pense que vous auriez raison. On dirait qu'ils vont faire une construction incrémentielle et "nettoyante", de sorte que la commande de construction importera la plupart des heures lorsqu'elles nettoient l'environnement et la reconstruisent.
Après avoir poussé tous les emballages, si vous regardez le schéma, beaucoup peuvent sembler non pondérés. Comme mentionné, Oracle devrait les compiler automatiquement lors de la première utilisation, mais si vous voulez plus de confort, utilisez simplement dbms_utility.comple_schema (...) pour compiler votre schéma. Son probablement similaire à l'UTLRP, mais ne nécessite pas SYSDBA PrisFS et n'affecte que un schéma.
Ce sont des très bons points. Nous avons également eu une sorte de victoire avec l'outil lui-même: nous venons de découvrir que nous pouvons demander jusqu'à 4 recompiles PL / SQL "sous les couvertures", et seules les erreurs qui persistent après la 4ème pass après la 4ème pass. J'aimerais toujours une commande de construction surtout correcte, car cela pourrait aider les 4 passes à aller un peu plus vite.
Ajoutez la commande suivante au sommet de votre script: p>
SET VÉRIFIEZ OFF P>
Ceci permettra à vos scripts de fonctionner sans validation et peut donc être exécuté dans n'importe quel ordre. P>
Vous pouvez ensuite demander à DBA_Errors pour obtenir toutes les erreurs et avertissements dans vos packages, vues et types. P>
La commande SQL Plus Vérifiez OFF CODE> Seulement I> Tournets de vérification des valeurs variables de substitution telles que
& schema_name. Code>
Une petite chose à faire attention lors de la marche de l'arbre de dépendance. Les dépendances des programmes non pondérés ne montrent pas ... donc, le corps de mais le corps de compile maintenant pkg4 code> n'est pas valide car
zzz_constants_pkg code> n'existe pas . P>
pkg4 code> est toujours invalide de sorte que la requête suivante ne renvoie pas sa dépendance sur
zzz_constants_pkg code>. ... p>
pkg4 code> et réinsertion des dépendances .... p>
solution réelle: le script ci-dessus semble donner la commande de construction correcte. Pourrait probablement être réécrit "plus agréable", mais je laisserai cela comme un exercice au lecteur. ;) p>
Après une discussion, l'outil de construction fonctionnera n em> (4, en fait) dans une rangée avant de déclarer des erreurs. Cela aiderait également à résoudre les dépendances compilez des erreurs si la commande de construction est fausse, mais je préfère simplement obtenir la commande de construction la première fois. P>
Essayez cela plutôt que 11.1 et plus. Exécutez le script dans n'importe quel ordre.
À la fin du problème, la commande suivante:
(Modifiez les paramètres de commande en fonction de vos besoins) Plus de détails sur dbms_utility.compile_scema p> p> p>
Voulez-vous dire des paquets Oracle PL / SQL?
Le seul moyen que j'ai fait est de le scripter et de tester le déploiement d'un nouveau schéma. Réorganisez les packages dans le script si nécessaire en fonction des erreurs ...
J'ai oublié de mentionner que SPC doit être chargé avant que BDY soit pour aider avec Package.function / STORED PROC résolution. Vous les séparez, sans chargement d'un seul fichier (l'extension de fichier me échappe au guichet automatique) - non?
@OMG Poneies: Oui, nous savons que nous devons compiler toutes les spécifications avant tout organisme. Le problème principal est l'ordre des spécifications. Oui, ils sont dans des fichiers séparés des corps.