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.