Естеството на частните функции е, че те са частни. Няма изгледи на речник с данни, които да ги излагат по подразбиране. USER_PROCEDURES и USER_ARGUMENTS показват само информация за публични процедури (дефинираните в пакет spec0.
Въпреки това можем да получим информация за тях с помощта на PL/SCOPE, но това изисква малко допълнителни усилия:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Сега можете да намерите частните си програмни единици с тази заявка:
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
);
За да получите аргументите на частна процедура, включете USAGE_ID от предишната заявка в тази заявка:
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
/
Това трябва да е ляво присъединяване, защото user_identifiers
има записи за типове данни за скаларни типове данни (знак, число, дата, клон), но не и сложни типове данни (xmltype, потребителски дефинирани типове).
Можем да получим много информация за процедурите от PL/SCOPE, въпреки че не е толкова лесно, колкото запитването на USER_PROCEDURES или USER_ARGUMENTS (всъщност е изненадващо тромаво). Открийте повече. Имайте предвид, че данните от PL/SCOPE се съхраняват в пространството за таблици SYSAUX, така че не влизайте в гореща вода с вашия DBA!