oracle - públicos - Retreive una lista de procedimientos/funciones privadas de un cuerpo de paquete
procedimientos privados oracle (1)
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 utilizando PL / SCOPE, pero para hacerlo necesitamos un poco de esfuerzo adicional:
SQL> alter session set plscope_settings=''IDENTIFIERS:ALL'';
-
SQL> alter package your_package compile body;
Ahora puede encontrar sus unidades de programa privadas 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, conecte USAGE_ID de la consulta anterior a 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
/
Esto debe ser una combinación de la izquierda porque user_identifiers
tiene entradas de tipo de datos para los tipos de datos escalares (carácter, número, fecha, clob), pero no tipos de datos complejos (xmltype, tipos definidos por el usuario).
Podemos obtener mucha información acerca de los procedimientos de PL / SCOPE, aunque no es tan fácil como consultar USER_PROCEDURES o USER_ARGUMENTS (de hecho, sorprendentemente torpe). Descubra más . Tenga en cuenta que los datos PL / SCOPE se almacenan en el tablespace SYSAUX, por lo que no debe entrar en contacto con su DBA.
Deseo obtener una lista con todos los procedimientos / funciones privadas de un cuerpo de paquete.
Para objetos públicos es fácil, pero no tengo idea de cómo hacer eso para objetos privados.