Naturen för privata tillställningar är att de är privata. Det finns inga dataordboksvyer som exponerar dem som standard. USER_PROCEDURES och USER_ARGUMENTS visar endast information för offentliga procedurer (de som definieras i en paketspecifikation0.
Vi kan dock få information om dem med PL/SCOPE, men att göra det kräver lite extra ansträngning:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Nu kan du hitta dina privata programenheter med denna fråga:
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
);
För att få argumenten för en privat procedur anslut USAGE_ID från den föregående frågan till den här frågan:
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
/
Detta måste vara en vänsterkoppling eftersom user_identifiers
har datatypposter för skalära datatyper (tecken, nummer, datum, clob) men inte komplexa datatyper (xmltype, användardefinierade typer).
Vi kan få massor av information om procedurer från PL/SCOPE, även om det inte är så lätt som att fråga efter USER_PROCEDURES eller USER_ARGUMENTS (i själva verket är det förvånansvärt klumpigt). Få reda på mer. Var medveten om att PL/SCOPE-data lagras på SYSAUX-tabellutrymmet, så kom inte i varmt vatten med din DBA!