sql >> Base de Datos >  >> RDS >> Oracle

Recuperar una lista de funciones/procedimientos privados del cuerpo de un paquete

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:

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