2008-11-18 6 views
4

Est-il possible d'écrire une requête PL/SQL pour identifier une liste complète des dépendances de procédures stockées? Je ne suis intéressé que par l'identification d'autres procédures stockées et je préfère ne pas limiter la profondeur de l'imbrication. Par exemple, si A appelle B, qui appelle C, qui appelle D, j'aimerais que B, C et D soient signalés comme dépendances pour A.Comment identifiez-vous par programme les dépendances d'une procédure stockée?

Répondre

8

Sur this page, vous trouverez la requête suivante qui utilise la table de dictionnaire PUBLIC_DEPENDENCY :

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 
ORDER BY lvl 
/
2

Je suis d'accord avec EddieAwad.

Il est important de souligner qu'Oracle ne fait que suivre les dépendances jusqu'au niveau de l'objet. Si vous avez vos procédures stockées dans un paquet, vous pouvez seulement suivre les dépendances si le paquet, pas les différentes fonctions/procédures dans le paquet.

Si vous cherchez à suivre les dépendances intra-paquet, vous aurez besoin d'un analyseur PLSQL.

2

Autre chose qui mérite d'être soulignée ici, il y a certains cas où la dépendance peut seulement être à l'exécution, qui malheureusement n'apparaîtra pas dans les métadonnées.

Par exemple, si vous construisez une instruction SQL à l'exécution, vous pouvez avoir un code similaire à:

... 
mysql := 'select count(*) from '||table_name_in; 
execute immediate mysql; 
... 

J'ai été brûlé par cette opération plusieurs fois, mais il n'y a malheureusement aucun moyen de trouver ces types de dépendances à l'avance car cela dépend potentiellement de l'entrée de l'utilisateur.

2

Pour obtenir tous les détails:

select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME' 
Questions connexes