Bagaimana Anda secara terprogram mengidentifikasi dependensi prosedur tersimpan?

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.


person ninesided    schedule 18.11.2008    source sumber


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
/
person Eddie Awad    schedule 18.11.2008

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.

person darreljnz    schedule 18.11.2008

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.

person Dwayne King    schedule 29.12.2008

Untuk mendapatkan semua detail:

select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME' 
person Kalpesh Nayak    schedule 13.04.2011