De aard van privéfuncties is dat ze privé zijn. Er zijn geen datadictionary-weergaven die deze standaard weergeven. USER_PROCEDURES en USER_ARGUMENTS tonen alleen informatie voor openbare procedures (degene die zijn gedefinieerd in een pakketspecificatie0.
We kunnen er echter informatie over krijgen met behulp van PL/SCOPE, maar dit vereist een beetje extra inspanning:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Nu kunt u uw privé-programma-eenheden vinden met deze vraag:
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
);
Om de argumenten van een privéprocedure te krijgen, plugt u de USAGE_ID van de vorige query in deze query:
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
/
Dit moet een left join zijn omdat user_identifiers
heeft datatype-items voor scalaire datatypes (karakter, getal, datum, clob) maar geen complexe datatypes (xmltype, door de gebruiker gedefinieerde types).
We kunnen veel informatie over procedures krijgen van PL/SCOPE, hoewel het niet zo eenvoudig is als het opvragen van USER_PROCEDURES of USER_ARGUMENTS (in feite is het verrassend onhandig). Meer te weten komen. Houd er rekening mee dat PL/SCOPE-gegevens worden opgeslagen in de SYSAUX-tabelruimte, dus kom niet in heet water met uw DBA!