Povahou soukromých funkcí je, že jsou soukromé. Neexistují žádná zobrazení datového slovníku, která je ve výchozím nastavení odhalují. USER_PROCEDURES a USER_ARGUMENTS zobrazují pouze informace pro veřejné procedury (ty definované v balíčku spec0.
Můžeme o nich však získat informace pomocí PL/SCOPE, ale to vyžaduje trochu dalšího úsilí:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Nyní můžete najít své soukromé programové jednotky pomocí tohoto dotazu:
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
);
Chcete-li získat argumenty soukromé procedury, připojte USAGE_ID z předchozího dotazu do tohoto dotazu:
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
/
Toto musí být levé spojení, protože user_identifiers
má položky datových typů pro skalární datové typy (znak, číslo, datum, clob), ale ne komplexní datové typy (xmltype, uživatelem definované typy).
Můžeme získat spoustu informací o procedurách z PL/SCOPE, i když to není tak snadné jako dotazování USER_PROCEDURES nebo USER_ARGUMENTS (ve skutečnosti je to překvapivě neohrabané). Zjistit více. Uvědomte si, že data PL/SCOPE jsou uložena v tabulkovém prostoru SYSAUX, takže se s vaším DBA nedostaňte do horké vody!