Oracle
 sql >> Base de données >  >> RDS >> Oracle

Récupérer une liste de procédures/fonctions privées à partir d'un corps de package

La nature des fonctions privées est qu'elles sont privées. Il n'y a pas de vues de dictionnaire de données qui les exposent par défaut. USER_PROCEDURES et USER_ARGUMENTS affichent uniquement les informations pour les procédures publiques (celles définies dans un package spec0.

Cependant, nous pouvons obtenir des informations à leur sujet en utilisant PL/SCOPE, mais cela nécessite un peu d'effort supplémentaire :

  1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
  2. SQL> alter package your_package compile body;

Vous pouvez maintenant trouver vos unités de programme privées avec cette requête :

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 
);

Pour obtenir les arguments d'une procédure privée, insérez le USAGE_ID de la requête précédente dans cette requête :

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
/

Cela doit être une jointure gauche car user_identifiers a des entrées de type de données pour les types de données scalaires (caractère, nombre, date, clob) mais pas pour les types de données complexes (xmltype, types définis par l'utilisateur).

Nous pouvons obtenir beaucoup d'informations sur les procédures à partir de PL/SCOPE, même si ce n'est pas aussi simple que d'interroger USER_PROCEDURES ou USER_ARGUMENTS (en fait, c'est étonnamment maladroit). En savoir plus. Sachez que les données PL/SCOPE sont stockées sur le tablespace SYSAUX, alors n'entrez pas dans l'eau chaude avec votre DBA !