Wie finden Sie heraus, wo eine gespeicherte Prozedur verwendet wird (in anderen gespeicherten Prozeduren)?

10

Ich habe eine gespeicherte Prozedur, die ich umgestalten möchte, in einer Datenbank mit Tausenden von SPs. Gibt es eine schnelle Möglichkeit, Verweise auf diese gespeicherte Prozedur in anderen SPs zu finden, damit ich sicher sein kann, dass ich beim Refactor keinen anderen Code beschädige?

Im Anwendungscode kann ich leicht genug nach Aufrufen des SP suchen und eine Textsuche über alle verschiedenen SQL-Dateien durchführen, die die SPs definieren. Es ist jedoch möglich, dass einige SPs in der Datenbank vorhanden sind, die auf diese Weise übersehen werden .

BEARBEITEN: Die gespeicherten Prozeduren, die ich zu finden versuche, sind Teil eines Pakets.

EDIT: Ich arbeite mit Oracle 11g

Peter Bagnall
quelle

Antworten:

11

DBA_DEPENDENCIES view hat alle Antworten auf solche Fragen.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';
Mindaugas Riauba
quelle
2
Dieser Ansatz funktioniert jedoch nicht, wenn Sie dynamisches SQL verwenden. dh wenn Sie eine Prozedur als Teil von dynamischem SQL ausführen. Andernfalls funktionieren dba_ oder all_dependencies hervorragend.
Raj
1
Dies ist hilfreich, und ich kann Funktionen und Prozeduren finden, die von einem Benutzer definiert wurden, aber ich kann anscheinend keine FNs oder SPs finden, die in einem Paket definiert sind. Irgendwelche Gedanken?
Peter Bagnall
In diesem Fall muss man nach einem Paket suchen. DBA_DEPENDENCIESZeigen Sie uns eher, was ungültig wird, wenn ein bestimmtes Objekt gelöscht wird. So können Sie zB herausfinden, welche Ansichten auf die Tabelle verweisen.
Mindaugas Riauba
0

Ich hatte eine ähnliche Situation, nur dass ich eine Liste von Paketen abrufen musste, die ein bestimmtes Paket verwenden; Also habe ich diese Abfrage gemacht, vielleicht hilft es:

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
quelle