La natura delle funzioni private è che sono private. Non ci sono viste del dizionario dei dati che le espongono per impostazione predefinita. USER_PROCEDURES e USER_ARGUMENTS mostrano solo le informazioni per le procedure pubbliche (quelle definite in un pacchetto spec0.
Tuttavia, possiamo ottenere informazioni su di loro utilizzando PL/SCOPE, ma ciò richiede un piccolo sforzo aggiuntivo:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Ora puoi trovare le tue unità di programma private con questa query:
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
);
Per ottenere gli argomenti di una procedura privata, inserire l'USAGE_ID dalla query precedente in questa 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
/
Questo deve essere un join sinistro perché user_identifiers
ha voci di tipi di dati per tipi di dati scalari (carattere, numero, data, clob) ma non tipi di dati complessi (tipo XML, tipi definiti dall'utente).
Possiamo ottenere molte informazioni sulle procedure da PL/SCOPE, anche se non è facile come interrogare USER_PROCEDURES o USER_ARGUMENTS (in effetti, è sorprendentemente goffo). Scopri di più. Tieni presente che i dati PL/SCOPE sono archiviati nel tablespace SYSAUX, quindi non entrare in acqua calda con il tuo DBA!