Comment trouvez-vous où une procédure stockée est utilisée (dans d'autres procédures stockées)


10

J'ai une procédure stockée que je souhaite refactoriser, dans une base de données contenant des milliers de SP. Existe-t-il un moyen rapide de trouver des références à cette procédure stockée dans d'autres SP afin que je puisse être sûr que je ne casse aucun autre code lorsque je refactorise.

Dans le code d'application, je peux rechercher les appels au SP assez facilement et je peux faire une recherche de texte sur tous les différents fichiers SQL qui définissent les SP, mais il est possible qu'il y ait des SP dans la base de données qui puissent être manqués de cette façon .

EDIT: Les procédures stockées que j'essaie de localiser font partie d'un package.

EDIT: je cours sur Oracle 11g

Réponses:


11

DBA_DEPENDENCIES view a toutes les réponses à ces questions.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';

2
Cette approche ne fonctionnera cependant pas si vous utilisez SQL dynamique. c'est-à-dire si vous exécutez une procédure dans le cadre de SQL dynamique. Sinon, dba_ ou all_dependencies fonctionnera très bien.
Raj

1
Ceci est utile, et je peux localiser les fonctions et procédures définies par un utilisateur, mais je ne semble pas être en mesure de trouver des FN ou des SP définis dans un package. Des pensées?
Peter Bagnall

Dans ce cas, il faut rechercher un package. DBA_DEPENDENCIESmontrez-nous plus ce qui sera invalidé si un objet particulier est déposé. Ainsi, par exemple, vous pouvez trouver quelles vues référencent le tableau.
Mindaugas Riauba


0

J'ai eu une situation similaire, seulement que j'avais besoin de récupérer une liste de packages qui utilisent un package spécifique; j'ai donc fait cette requête, peut-être que cela aide:

with dep2 as (
    select dep.*
    from all_dependencies dep
    where dep.owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_type = 'PACKAGE'
    and dep.dependency_type != 'NON-EXISTENT'
    and (dep.referenced_owner || '.' || dep.referenced_name) != (dep.owner || '.' || dep.name)
),
dep3 as (
    select owner || '.' || name as child,
    referenced_owner || '.' || referenced_name as parent
    from dep2
)
select connect_by_root parent, lpad(' ',2*(level-1)) || to_char(child) 
from dep3
start with parent = 'SCHEMA.PACKAGE_NAME'
connect by nocycle prior child = parent 
and exists (select 1 from all_source where (owner || '.' || name) = dep3.child and upper(text) like upper('%optional, some string you may want to search%')) 
;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.