Como você encontra onde um procedimento armazenado é usado (em outros procedimentos armazenados)

10

Eu tenho um procedimento armazenado que eu quero refatorar, em um banco de dados que possui milhares de SPs. Existe uma maneira rápida de encontrar referências a esse procedimento armazenado em outros SPs, para ter certeza de que não estou quebrando nenhum outro código ao refatorar.

No código do aplicativo, posso procurar chamadas para o SP com bastante facilidade e fazer uma pesquisa de texto em todos os vários arquivos sql que definem os SPs, mas é possível que haja alguns SPs no banco de dados que possam ser perdidos dessa maneira .

EDIT: Os procedimentos armazenados que estou tentando localizar fazem parte de um pacote.

EDIT: Estou executando no Oracle 11g

Peter Bagnall
fonte

Respostas:

11

DBA_DEPENDENCIES O View tem todas as respostas para essas perguntas.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';
Mindaugas Riauba
fonte
2
Essa abordagem, no entanto, não funcionará se você usar sql dinâmico. ou seja, se você executar um procedimento como parte do sql dinâmico. Caso contrário, dba_ ou all_dependencies funcionarão muito bem.
Raj
11
Isso é útil, e posso localizar funções e procedimentos definidos por um usuário, mas não consigo encontrar FNs ou SPs definidos em um pacote. Alguma ideia?
Peter Bagnall
Nesse caso, é preciso procurar um pacote. DBA_DEPENDENCIESmostre-nos mais como o que será invalidado se um objeto específico for descartado. Então, por exemplo, você pode encontrar o que vê a tabela de referências.
Mindaugas Riauba
0

Eu tive uma situação semelhante, só que precisava recuperar uma lista de pacotes que usam um pacote específico; então eu fiz essa consulta, talvez ajude:

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