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

contenu de la déclaration de colis

Vous pouvez trouver des détails sur les fonctions et les procédures d'un package en interrogeant ALL_ARGUMENTS vue du dictionnaire de données, ou ses frères USER_ARGUMENTS et DBA_ARGUMENTS.

Pour un exemple, j'ai créé le package suivant :

CREATE OR REPLACE PACKAGE demo AS
    PROCEDURE p_none;
    PROCEDURE p_two(a INTEGER, b INTEGER);

    FUNCTION f_none RETURN INTEGER;
    FUNCTION f_three(c INTEGER, q INTEGER, z INTEGER) RETURN INTEGER;
END;

J'ai ensuite exécuté la requête suivante :

SQL> select object_name, argument_name, sequence, in_out
  2    from all_arguments
  3   where package_name = 'DEMO'
  4   order by object_name, sequence;

OBJECT_NAME                    ARGUMENT_NAME                    SEQUENCE IN_OUT
------------------------------ ------------------------------ ---------- ---------
F_NONE                                                                 1 OUT
F_THREE                                                                1 OUT
F_THREE                        C                                       2 IN
F_THREE                        Q                                       3 IN
F_THREE                        Z                                       4 IN
P_NONE                                                                 0 IN
P_TWO                          A                                       1 IN
P_TWO                          B                                       2 IN

Ici, vous pouvez voir tous les arguments des fonctions et des procédures de notre package. Notez qu'il existe une entrée supplémentaire avec un nom d'argument nul pour la valeur de retour de chacune des deux fonctions. De plus, la procédure qui n'a pas d'arguments a une ligne avec un nom d'argument nul et un SEQUENCE nul valeur.

Ainsi, pour lister toutes les fonctions, vous pouvez rechercher toutes les entrées de cette vue avec un nom d'argument nul et une SEQUENCE valeur différente de 0 :

SQL> select distinct object_name
  2    from all_arguments
  3   where package_name = 'DEMO'
  4     and argument_name is null
  5     and sequence != 0;

OBJECT_NAME
------------------------------
F_THREE
F_NONE

Répertorier les procédures d'une manière similaire est un peu plus délicat :

SQL> select distinct object_name
  2    from all_arguments a1
  3   where package_name = 'DEMO'
  4     and (   sequence = 0
  5          or not exists (select 0
  6                           from all_arguments a2
  7                          where a2.package_name = 'DEMO'
  8                            and a2.object_name = a1.object_name
  9                            and a2.argument_name is null));

OBJECT_NAME
------------------------------
P_TWO
P_NONE

Bien que cette approche semble fonctionner avec les procédures et les fonctions, je ne sais pas comment répertorier les variables de portée de package, les types et autres éléments déclarés dans un en-tête de package sans analyser la spécification du package, comme suggéré par @wweicker.