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