Sifat dari fungsi pribadi adalah bahwa mereka bersifat pribadi. Tidak ada tampilan kamus data yang mengeksposnya secara default. USER_PROCEDURES dan USER_ARGUMENTS hanya menampilkan informasi untuk prosedur publik (yang didefinisikan dalam spesifikasi paket0.
Namun, kami dapat memperoleh informasi tentang mereka menggunakan PL/SCOPE, tetapi untuk melakukannya memerlukan sedikit usaha tambahan:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Sekarang Anda dapat menemukan unit program pribadi Anda dengan kueri ini:
select ui.type, ui.name, ui.usage_id
from user_identifiers ui
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DEFINITION'
and ui.type in ('PROCEDURE', 'FUNCTION')
minus
( select 'PROCEDURE', upr.procedure_name
from user_procedures upr
where upr.object_name = 'YOUR_PACKAGE'
union
select 'FUNCTION', uarg.object_name
from user_arguments uarg
where uarg.package_name = 'YOUR_PACKAGE'
and uarg.position = 0
);
Untuk mendapatkan argumen dari prosedur pribadi, masukkan USAGE_ID dari kueri sebelumnya ke kueri ini:
select ui.name
, ui.type
, ui.usage_id
, ui2.type as param_datatype
from user_identifiers ui
left join user_identifiers ui2
on ui2.usage_context_id = ui.usage_id
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DECLARATION'
and ui.usage_context_id = :private_proc_usage_id
/
Ini harus bergabung dengan kiri karena user_identifiers
memiliki entri tipe data untuk tipe data skalar (karakter, angka, tanggal, gumpalan) tetapi bukan tipe data kompleks (tipe xml, tipe yang ditentukan pengguna).
Kita bisa mendapatkan banyak informasi tentang prosedur dari PL/SCOPE, meskipun tidak semudah menanyakan USER_PROCEDURES atau USER_ARGUMENTS (sebenarnya, ini sangat kikuk). Temukan lebih banyak lagi. Ketahuilah bahwa data PL/SCOPE disimpan di tablespace SYSAUX, jadi jangan masuk ke air panas dengan DBA Anda!