web-dev-qa-db-fra.com

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

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 des appels à 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 peut être manquée 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

10
Peter Bagnall

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

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

Cela semble fonctionner - c'est moins élégant que la réponse de @ MindaugasRiauba, mais il semble trouver des références de tous les packages.

SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%STORED_PROCEDURE_NAME%')

(De Comment savoir si un package, une procédure ou une fonction PL/SQL est utilisé? )

6
Peter Bagnall

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%')) 
;
0
Bogdan