Bagaimana Anda menemukan di mana prosedur tersimpan digunakan (dalam prosedur tersimpan lainnya)

10

Saya memiliki prosedur tersimpan yang ingin saya refactor, dalam database yang memiliki ribuan SP. Apakah ada cara cepat untuk menemukan referensi ke prosedur tersimpan di SP lain sehingga saya bisa yakin bahwa saya tidak melanggar kode lain ketika saya refactor.

Dalam kode aplikasi saya dapat mencari panggilan ke SP dengan cukup mudah, dan saya dapat melakukan pencarian teks pada semua file sql yang menentukan SP, tetapi mungkin saja ada beberapa SP dalam database yang mungkin terlewatkan seperti itu. .

EDIT: Prosedur tersimpan yang saya coba cari adalah bagian dari paket.

EDIT: Saya menggunakan Oracle 11g

Peter Bagnall
sumber

Jawaban:

11

DBA_DEPENDENCIES lihat memiliki semua jawaban untuk pertanyaan seperti itu.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';
Mindaugas Riauba
sumber
2
Namun pendekatan ini tidak akan berfungsi jika Anda menggunakan sql dinamis. yaitu jika Anda menjalankan prosedur sebagai bagian dari sql dinamis. Kalau tidak, dba_ atau all_dependencies akan bekerja dengan baik.
Raj
1
Ini sangat membantu, dan saya dapat menemukan fungsi dan prosedur yang ditentukan oleh pengguna, tetapi saya sepertinya tidak dapat menemukan FN atau SP yang didefinisikan dalam sebuah paket. Adakah pikiran?
Peter Bagnall
Dalam hal ini seseorang harus mencari paket. DBA_DEPENDENCIEStunjukkan lebih seperti apa yang akan dibatalkan jika objek tertentu dijatuhkan. Jadi misalnya Anda dapat menemukan apa yang dilihat tabel referensi.
Mindaugas Riauba
0

Saya memiliki situasi yang serupa, hanya saja saya perlu mengambil daftar paket yang menggunakan paket tertentu; jadi saya membuat pertanyaan ini, mungkin itu membantu:

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
sumber