Il est possible de récupérer les signatures de méthodes individuelles à partir du dictionnaire de données. La vue pertinente est USER/ALL/DBA_ARGUMENTS.
Il ya quelques problèmes à surveiller. Si un argument a une postition de 0, c'est la valeur de retour d'une fonction et non un paramètre. Si le paramètre est un type complexe (tel qu'une table imbriquée ou un enregistrement PL/SQL), il apparaîtra plusieurs fois, chaque couche incrémentant le data_level
.
La requête suivante joint les arguments à leurs procédures propriétaires. J'exclus les entrées dans USER_PROCEDURES au niveau du package (c'est-à-dire subprogram_id=0
) et les entrées dans USER_ARGUMENTS pour les niveaux inférieurs de complex_type (c'est-à-dire, data_level > 0
). La requête gère également les procédures sans aucun paramètre.
SQL> select o.object_type
2 , case
3 when o.object_type in ('PACKAGE', 'TYPE') then p.object_name
4 else null
5 end as object_name
6 , case
7 when o.object_type in ('PACKAGE', 'TYPE') then p.procedure_name
8 else p.object_name
9 end as procedure_name
10 , case
11 when a.position != 0 then a.argument_name
12 when a.position = 0 then '** return value **'
13 else null
14 end as argument_name
15 , a.data_type
16 from user_arguments a
17 , user_procedures p
18 , user_objects o
19 where o.object_type in ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE')
20 and p.object_name = o.object_name
21 and p.subprogram_id != 0
22 and a.object_id (+) = p.object_id
23 and a.subprogram_id (+) = p.subprogram_id
24 and a.data_level(+) = 0
25 order by o.object_type, o.object_name, p.subprogram_id, a.position
26/
OBJECT_TYPE OBJECT_NAME PROCEDURE_NAME ARGUMENT_NAME DATA_TYPE
------------------- ------------------------------ ------------------------------ ------------------------------ -------
FUNCTION COMPARE_OBJECTS ** return value ** PL/SQL BOOLEAN
FUNCTION COMPARE_OBJECTS OBJ1 UNDEFINED
FUNCTION COMPARE_OBJECTS OBJ2 UNDEFINED
FUNCTION GET_EMPS ** return value ** REF CURSOR
FUNCTION GET_EMPS P_ARGS UNDEFINED
FUNCTION STR_TO_NUMBER_TOKENS ** return value ** TABLE
FUNCTION STR_TO_NUMBER_TOKENS P_STRING VARCHAR2
FUNCTION STR_TO_NUMBER_TOKENS P_SEPARATOR VARCHAR2
PACKAGE P23 POP_ARRAY ** return value ** TABLE
PACKAGE P23 POP_ARRAY P_NO NUMBER
PACKAGE P23 INS_TABLE P_ARRAY TABLE
PROCEDURE CHANGE_EMP_SAL P_ENO NUMBER
PROCEDURE CHANGE_EMP_SAL P_NEW_SAL NUMBER
PROCEDURE PRINTE
TYPE NEW_EMP EQUALS ** return value ** RAW
TYPE NEW_EMP EQUALS SELF OBJECT
22 rows selected.
SQL>
Je aurait pu choisir d'autres informations utiles de USER_ARGUMENTS tels que IN_OUT ou si le paramètre est réglé par défaut, mais je me suis dit qu'il défilée déjà assez.
Merci Peter pour votre réponse! J'ai exécuté Select * From dba_source (j'ai les permissions appropriées), mais je ne vois ni mon paquet ni ma procédure. Je suis nouveau à ORACLE, donc je pourrais facilement manquer quelque chose ici. J'ai remarqué que PL/SQL Developer met une marque d'erreur sur mon nœud de paquetage dans l'arborescence de gauche. Est-ce lié au problème que je rencontre? Voici mon code de package: créer pgtest paquet comme procédure p comme commence null; fin; fin; –
Vous devez créer un paquet 'create package pgtest as procedure p; end; 'et un corps de package' create pgtest de corps de package en tant que procédure p comme begin null; fin; fin; ' –
Ah Ha! Je les ai exécutées séparément, et maintenant le nœud semble OK. Mais, encore, pas d'enregistrement dans dba_source (ou autres). –