Je tente de créer une liste de dépendances de packages PL/SQL afin de pouvoir configurer un script de génération automatique pour que mes packages s'exécutent sur le serveur de test. Est-il possible de commencer avec un seul paquet (un paquet "root" identifié par son nom, idéalement), puis de trouver toutes les dépendances, et l'ordre dans lequel elles doivent être compilées? Les dépendances sont déjà entièrement résolues dans mon schéma personnel (donc au moins j'ai un endroit pour commencer - mais où dois-je aller ensuite?).Ordre de construction Oracle et dépendances du package PL/SQL
(Oracle 10,2)
EDIT:
L'outil de construction qui est utilisé utilisera l'ordre de construction et sera retreive ces fichiers dans l'ordre de contrôle de code source, et de les transmettre ensuite à Oracle compile (l'outil de construction proprement dit est écrit en Python ou Java ou les deux - je n'ai pas accès à la source). Fondamentalement, l'outil de construction a besoin en entrée d'une liste de fichiers à compiler dans l'ordre où ils doivent être compilés en, et accéder à ces fichiers dans le contrôle de source. Si c'est le cas, tout fonctionnera très bien.
EDIT:
Merci pour les scripts soignées. Malheureusement, le processus de construction est la plupart du temps hors de mes mains. Le processus est basé sur un outil de construction qui a été construit par le fournisseur du produit avec lequel 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 ils doivent être intégrés. S'il y a une erreur de compilateur, l'outil de construction échoue, nous devons soumettre manuellement une demande pour une nouvelle construction. Une liste de fichiers dans l'ordre dans lequel ils doivent être compilés est donc importante.
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'avoir le bon ordre ... Si je trouve quelque chose qui fonctionne, je l'afficherai ici.
EDIT: (! Avec le code)
Je sais qu'en général, ce genre de chose n'est pas nécessaire pour Oracle, mais pour tous ceux qui est toujours intéressé ...
Je bricolé un petit script qui semble être en mesure d'obtenir un ordre de construction tels que tous les paquets seront construits dans l'ordre correct sans erreur liés à la dépendance (par rapport à pacakges) la première fois:
declare
type t_dep_list is table of varchar2(40) index by binary_integer;
dep_list t_dep_list;
i number := 1;
cursor c_getObjDepsByNameAndType is
--based on a query found here: http://www.oracle.com/technology/oramag/code/tips2004/091304.html
select lvl, u.object_id, u.object_type, LPAD(' ', lvl) || object_name obj
FROM (SELECT level lvl, object_id
FROM SYS.public_dependency s
START WITH s.object_id = (select object_id
from user_objects
where object_name = UPPER(:OBJECT_NAME)
and object_type = UPPER(:OBJECT_TYPE))
CONNECT BY s.object_id = PRIOR referenced_object_id
GROUP BY level, object_id) tree, user_objects u
WHERE tree.object_id = u.object_id
and u.object_type like 'PACKAGE%' --only look at packages, not interested in other types of objects
ORDER BY lvl desc;
function fn_checkInList(in_name in varchar2) return boolean is
begin
for j in 1 .. dep_list.count loop
if dep_list(j) = in_name then
return true;
end if;
end loop;
return false;
end;
procedure sp_getDeps(in_objID in user_objects.object_id%type, in_name in varchar2) is
cursor c_getObjDepsByID(in_objID in user_objects.object_id%type) is
--based on a query found here: http://www.oracle.com/technology/oramag/code/tips2004/091304.html
select lvl, u.object_id, u.object_type, LPAD(' ', lvl) || object_name obj
FROM (SELECT level lvl, object_id
FROM SYS.public_dependency s
START WITH s.object_id = (select uo.object_id
from user_objects uo
where uo.object_name =
(select object_name from user_objects uo where uo.object_id = in_objID)
and uo.object_type = 'PACKAGE BODY')
CONNECT BY s.object_id = PRIOR referenced_object_id
GROUP BY level, object_id) tree, user_objects u
WHERE tree.object_id = u.object_id
and u.object_id <> in_objID --exclude self (requested Object ID) from list.
ORDER BY lvl desc;
begin
--loop through the dependencies
for r in c_getObjDepsByID(in_objID) loop
if fn_checkInList(trim(r.obj)) = false and (r.object_type = 'PACKAGE' or r.object_type = 'PACKAGE BODY') and
trim(r.obj) <> trim(in_name) then
dbms_output.put_line('checking deps of: ' || r.obj || ' ' || r.object_id || ' level: ' || r.lvl);
--now for each dependency, check the sub-dependency
sp_getDeps(r.object_id, trim(r.obj));
--add the object to the dependency list.
dep_list(i) := trim(r.obj);
i := i + 1;
end if;
end loop;
exception
when NO_DATA_FOUND then
dbms_output.put_line('no more data for: ' || in_objID);
end;
begin
for r in c_getObjDepsByNameAndType loop
dbms_output.put_line('top-level checking deps of: ' || r.obj || ' ' || r.object_id || ' level: ' || r.lvl);
sp_getDeps(r.object_id, trim(r.obj));
end loop;
dbms_output.put_line('dep count: ' || dep_list.count);
for j in 1 .. dep_list.count loop
dbms_output.put_line('obj: ' || j || ' ' || dep_list(j));
end loop;
end;
Je sais ce n'est pas le plus joli code (globals partout, etc ...), et je vais probablement le rediffuser si je peux avoir une chance cet après-midi de le nettoyer, mais maintenant, il produit un ordre de build qui semble courir la première fois sans problèmes.
:OBJECT_NAME
doit être l'objet racine dont vous souhaitez suivre toutes les dépendances et l'ordre de génération. Pour moi, c'est un paquet principal avec une seule méthode qui est le point d'entrée dans le reste du système.
J'ai principalement limité à PACKAGE BODY
, mais il ne devrait pas être trop de travail pour inclure d'autres types, tels que les déclencheurs.Une dernière chose, l'objet spécifié par :OBJECT_NAME
n'apparaîtra pas dans la sortie, mais il devrait être le dernier élément, donc vous devrez l'ajouter manuellement à votre liste de construction.
MISE À JOUR: Je viens de découvrir user_dependencies
et all_dependencies
, ce code pourrait probablement être beaucoup plus simple maintenant.
voulez-vous dire Oracle packages PL/SQL? –
La seule façon de le faire est de le scripter et de tester le déploiement sur un nouveau schéma. Réorganiser les paquets dans le script selon les besoins en fonction des erreurs ... –
Oui, je voulais dire des paquets. – FrustratedWithFormsDesigner