Jak znaleźć, gdzie używana jest procedura przechowywana (w innych procedur przechowywanych)

10

Mam procedurę składowaną, którą chcę refaktoryzować, w bazie danych zawierającej tysiące SP. Czy istnieje szybki sposób na znalezienie odwołań do tej procedury przechowywanej w innych SP, aby mieć pewność, że nie łamię żadnego innego kodu podczas refaktoryzacji.

W kodzie aplikacji mogę łatwo wyszukać wywołania SP i mogę przeszukiwać tekst we wszystkich plikach SQL, które definiują SP, ale możliwe, że w bazie danych mogą być pewne SP, które mogą zostać pominięte w ten sposób .

EDYCJA: Procedury składowane, które próbuję zlokalizować, są częścią pakietu.

EDYCJA: Korzystam z Oracle 11g

Peter Bagnall
źródło

Odpowiedzi:

11

DBA_DEPENDENCIES widok ma wszystkie odpowiedzi na takie pytania.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';
Mindaugas Riauba
źródło
2
To podejście nie będzie jednak działać, jeśli używasz dynamicznego SQL. tzn. jeśli wykonasz procedurę jako część dynamicznego SQL. W przeciwnym razie dba_ lub all_dependencies będą działać świetnie.
Raj
1
Jest to pomocne i mogę zlokalizować funkcje i procedury zdefiniowane przez użytkownika, ale wydaje mi się, że nie jestem w stanie znaleźć FN ani SP zdefiniowanych w pakiecie. jakieś pomysły?
Peter Bagnall,
W takim przypadku należy wyszukać pakiet. DBA_DEPENDENCIESpokaż nam bardziej, co zostanie unieważnione, jeśli dany obiekt zostanie upuszczony. Na przykład możesz znaleźć tabelę odsyłaczy.
Mindaugas Riauba,
0

Miałem podobną sytuację, tyle że potrzebowałem pobrać listę pakietów, które używają określonego pakietu; więc zrobiłem to zapytanie, może to pomaga:

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
źródło