Karakteren af private funktioner er, at de er private. Der er ingen dataordbogsvisninger, der afslører dem som standard. USER_PROCEDURES og USER_ARGUMENTS viser kun oplysninger om offentlige procedurer (dem, der er defineret i en pakkespecifikation0.
Vi kan dog få oplysninger om dem ved hjælp af PL/SCOPE, men at gøre det kræver en lille smule ekstra indsats:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Nu kan du finde dine private programenheder med denne forespørgsel:
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
);
For at få argumenterne for en privat procedure indsæt USAGE_ID fra den forrige forespørgsel i denne forespørgsel:
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
/
Dette skal være en venstre join, fordi user_identifiers
har datatypeindgange for skalære datatyper (tegn, tal, dato, clob), men ikke komplekse datatyper (xmltype, brugerdefinerede typer).
Vi kan få masser af information om procedurer fra PL/SCOPE, selvom det ikke er så nemt som at forespørge USER_PROCEDURES eller USER_ARGUMENTS (faktisk er det overraskende klodset). Find ud af mere. Vær opmærksom på, at PL/SCOPE-data er gemt på SYSAUX tablespace, så kom ikke i varmt vand med din DBA!