9
votes

Oracle Cuild Ordre et PL / SQL Dépendances de package

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)

EDIT:

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 et d'accéder à ces fichiers du contrôle de la source. Si cela le fait, tout fonctionnera assez bien.

EDIT:

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.

edit:

trouvé ceci: http://www.oracle.com/technology/oramag/code/tips2004/091304.html Me donne les dépendances de tout objet. Maintenant, j'ai juste besoin d'obtenir le droit de commander ... Si je reçois quelque chose de travailler, je le posterai ici.

EDIT: (avec code!) < 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 ...

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: xxx

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.

: objet_name 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.

: objet_type J'ai principalement limité au corps de paquet , mais cela ne devrait pas être trop de travail pour inclure d'autres types, tels que des déclencheurs.

une dernière chose, l'objet spécifié par : objet_name n'apparaît pas Dans la sortie, cela devrait être le dernier élément, vous devrez donc ajouter cela à votre liste de construction manuellement.

Mise à jour: Je viens de découvrir user_depends < / code> et all_dependances , ce code pourrait probablement être beaucoup plus simple maintenant.


4 commentaires

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.


7 Réponses :


2
votes

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;
/


1 commentaires

Intéressant, mais je ne suis pas sûr que cela fournira une commande de construction réelle.



0
votes

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.

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.

exemple de script que j'utilise: xxx


0 commentaires

10
votes

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> xxx pré>

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?
a. strong> Ce n'est pas une dépendance circulaire .... p> xxx pré>

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> xxx pré>

alors nous reconstruisons ... p> xxx pré>

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> xxx pré>

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>


5 commentaires

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.



0
votes

Ajoutez la commande suivante au sommet de votre script:

SET VÉRIFIEZ OFF

Ceci permettra à vos scripts de fonctionner sans validation et peut donc être exécuté dans n'importe quel ordre.

Vous pouvez ensuite demander à DBA_Errors pour obtenir toutes les erreurs et avertissements dans vos packages, vues et types.


1 commentaires

La commande SQL Plus Vérifiez OFF Seulement Tournets de vérification des valeurs variables de substitution telles que & schema_name.



1
votes

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 ... xxx

donc, le corps de pkg4 n'est pas valide car zzz_constants_pkg n'existe pas . xxx

mais le corps de pkg4 est toujours invalide de sorte que la requête suivante ne renvoie pas sa dépendance sur zzz_constants_pkg . ... xxx

compile maintenant pkg4 et réinsertion des dépendances .... xxx


0 commentaires

-1
votes

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. ;)

Après une discussion, l'outil de construction fonctionnera n (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.


0 commentaires

0
votes

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) xxx

Plus de détails sur dbms_utility.compile_scema


0 commentaires