¿Cómo encontrar dónde se utiliza un procedimiento almacenado (en otros procedimientos almacenados)


10

Tengo un procedimiento almacenado que quiero refactorizar, en una base de datos que tiene miles de SP. ¿Hay una manera rápida de encontrar referencias a ese procedimiento almacenado en otros SP para que pueda estar seguro de que no estoy rompiendo ningún otro código cuando refactorice?

En el código de la aplicación, puedo buscar llamadas al SP con bastante facilidad, y puedo hacer una búsqueda de texto en todos los diversos archivos sql que definen los SP, pero es posible que haya algunos SP en la base de datos que pueden perderse de esa manera. .

EDITAR: Los procedimientos almacenados que estoy tratando de localizar son parte de un paquete.

EDITAR: estoy corriendo en Oracle 11g

Respuestas:


11

DBA_DEPENDENCIES view tiene todas las respuestas a tales preguntas.

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

2
Sin embargo, este enfoque no funcionará si usa sql dinámico. es decir, si ejecuta un procedimiento como parte de sql dinámico. De lo contrario, dba_ o all_dependencies funcionarán muy bien.
Raj

1
Esto es útil, y puedo localizar funciones y procedimientos definidos por un usuario, pero parece que no puedo encontrar FN o SP que están definidos en un paquete. ¿Alguna idea?
Peter Bagnall

En este caso, uno tiene que buscar un paquete. DBA_DEPENDENCIESmuéstrenos más como lo que se invalidará si se cae un objeto en particular. Entonces, por ejemplo, puede encontrar lo que ve la tabla de referencias.
Mindaugas Riauba


0

Tuve una situación similar, solo que necesitaba recuperar una lista de paquetes que usan un paquete específico; así que hice esta consulta, tal vez ayude:

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%')) 
;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.