Oracle
 sql >> Database >  >> RDS >> Oracle

Recupera un elenco di procedure/funzioni private dal corpo di un pacchetto

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:

  1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
  2. 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!