Come si trova dove viene utilizzata una stored procedure (in altre stored procedure)


10

Ho una procedura memorizzata che voglio refactoring, in un database che ha migliaia di SP. Esiste un modo rapido per trovare riferimenti a quella procedura memorizzata in altri SP in modo da poter essere sicuro di non infrangere nessun altro codice durante il refactoring.

Nel codice dell'applicazione posso cercare le chiamate all'SP abbastanza facilmente, e posso fare una ricerca di testo su tutti i vari file sql che definiscono gli SP, ma è possibile che nel database possano esserci degli SP che potrebbero mancare in quel modo .

EDIT: le procedure memorizzate che sto cercando di individuare fanno parte di un pacchetto.

EDIT: sto correndo su Oracle 11g

Risposte:


11

DBA_DEPENDENCIES view ha tutte le risposte a tali domande.

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

2
Questo approccio tuttavia non funzionerà se si utilizza sql dinamico. cioè se si esegue una procedura come parte di sql dinamico. Altrimenti dba_ o all_dependencies funzioneranno alla grande.
Raj,

1
Questo è utile e posso individuare funzioni e procedure definite da un utente, ma non riesco a trovare FN o SP che sono definiti in un pacchetto. qualche idea?
Peter Bagnall,

In questo caso bisogna cercare un pacchetto. DBA_DEPENDENCIESmostraci più come ciò che sarà invalidato se un particolare oggetto viene eliminato. Quindi, ad esempio, puoi trovare quali visualizzazioni fanno riferimento alla tabella.
Mindaugas Riauba


0

Ho avuto una situazione simile, solo che avevo bisogno di recuperare un elenco di pacchetti che utilizzano un pacchetto specifico; quindi ho fatto questa query, forse aiuta:

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%')) 
;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.