La naturaleza de las funciones privadas es que son privadas. No hay vistas de diccionario de datos que los expongan de forma predeterminada. USER_PROCEDURES y USER_ARGUMENTS solo muestran información para procedimientos públicos (los definidos en un paquete spec0.
Sin embargo, podemos obtener información sobre ellos usando PL/SCOPE, pero hacerlo requiere un poco de esfuerzo adicional:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
Ahora puede encontrar las unidades de su programa privado con 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 obtener los argumentos de un procedimiento privado, inserte el USAGE_ID de la consulta anterior en esta 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
/
Debe ser una combinación izquierda porque user_identifiers
tiene entradas de tipos de datos para tipos de datos escalares (carácter, número, fecha, clob) pero no tipos de datos complejos (tipo xml, tipos definidos por el usuario).
Podemos obtener mucha información sobre los procedimientos de PL/SCOPE, aunque no es tan fácil como consultar USER_PROCEDURES o USER_ARGUMENTS (de hecho, es sorprendentemente torpe). Saber más. Tenga en cuenta que los datos de PL/SCOPE se almacenan en el tablespace SYSAUX, ¡así que no se meta en problemas con su DBA!