Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Recupere uma lista de procedimentos/funções privadas de um corpo de pacote


A natureza das funções privadas é que elas são privadas. Não há visualizações de dicionário de dados que as exponham por padrão. USER_PROCEDURES e USER_ARGUMENTS mostram apenas informações para procedimentos públicos (os definidos em um pacote spec0.

No entanto, podemos obter informações sobre eles usando PL/SCOPE, mas isso requer um pouco de esforço adicional:
  1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
  2. SQL> alter package your_package compile body;

Agora você pode encontrar suas unidades de programa privado com esta consulta:
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 
);

Para obter os argumentos de um procedimento privado, insira o USAGE_ID da consulta anterior nesta consulta:
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
/

Isso precisa ser uma junção esquerda porque user_identifiers tem entradas de tipo de dados para tipos de dados escalares (caractere, número, data, clob), mas não tipos de dados complexos (xmltype, tipos definidos pelo usuário).

Podemos obter muitas informações sobre procedimentos do PL/SCOPE, embora não seja tão fácil quanto consultar USER_PROCEDURES ou USER_ARGUMENTS (na verdade, é surpreendentemente desajeitado). Descubra mais. Esteja ciente de que os dados PL/SCOPE são armazenados no tablespace SYSAUX, portanto, não entre em apuros com seu DBA!