Apakah mungkin untuk menulis kueri PL/SQL untuk mengidentifikasi daftar lengkap dependensi prosedur tersimpan? Saya hanya tertarik untuk mengidentifikasi prosedur tersimpan lainnya dan saya memilih untuk tidak membatasi kedalaman sarang yang didapatnya. Misalnya, jika A memanggil B, yang memanggil C, yang memanggil D, saya ingin B, C, dan D dilaporkan sebagai dependensi untuk A.
Bagaimana Anda secara terprogram mengidentifikasi dependensi prosedur tersimpan?
Jawaban (4)
Di halaman ini, Anda akan menemukan kueri berikut yang menggunakan Tabel kamus PUBLIC_DEPENDENCY:
SELECT lvl
, u.object_id
, u.object_type
, LPAD (' ', lvl) || object_name obj
FROM ( SELECT LEVEL lvl, object_id
FROM SYS.public_dependency s
START WITH s.object_id =
( SELECT object_id
FROM user_objects
WHERE object_name = UPPER ('&OBJECT_NAME')
AND object_type = UPPER ('&OBJECT_TYPE'))
CONNECT BY s.object_id = PRIOR referenced_object_id
GROUP BY LEVEL, object_id) tree
, user_objects u
WHERE tree.object_id = u.object_id
ORDER BY lvl
/
Saya setuju dengan Eddie Awad.
Perlu diperhatikan bahwa Oracle hanya melacak dependensi hingga ke tingkat objek. Jika Anda memiliki prosedur tersimpan dalam sebuah paket, Anda hanya dapat melacak dependensi paket tersebut, bukan fungsi/prosedur individual dalam paket tersebut.
Jika Anda ingin melacak dependensi intra-paket maka Anda memerlukan parser PLSQL.
Hal lain yang perlu diperhatikan di sini adalah bahwa ada kasus tertentu di mana ketergantungan mungkin hanya terjadi pada waktu proses, yang sayangnya tidak akan muncul di metadata.
Misalnya, jika Anda membuat pernyataan SQL saat runtime, Anda mungkin memiliki kode yang mirip dengan:
...
mysql := 'select count(*) from '||table_name_in;
execute immediate mysql;
...
Saya telah mengalami hal ini beberapa kali, tetapi sayangnya tidak ada cara untuk menemukan jenis dependensi ini terlebih dahulu karena berpotensi bergantung pada input pengguna.
Untuk mendapatkan semua detail:
select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME'