Puede encontrar detalles sobre las funciones y procedimientos en un paquete consultando TODOS_ARGUMENTOS vista de diccionario de datos, o sus hermanos USER_ARGUMENTS y DBA_ARGUMENTS.
Para un ejemplo, creé el siguiente paquete:
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;
Luego ejecuté la siguiente consulta en su contra:
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
Aquí puede ver todos los argumentos de las funciones y procedimientos en nuestro paquete. Tenga en cuenta que hay una entrada adicional con un nombre de argumento nulo para el valor de retorno de cada una de las dos funciones. Además, el procedimiento que no tiene argumentos tiene una fila con un nombre de argumento nulo y un cero SEQUENCE
valor.
Entonces, para enumerar todas las funciones, puede buscar todas las entradas en esta vista con un nombre de argumento nulo y una SEQUENCE
valor no igual a 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
Enumerar los procedimientos de manera similar es un poco más complicado:
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
Si bien este enfoque parece funcionar con procedimientos y funciones, no sé cómo enumerar las variables, los tipos y otras cosas del alcance del paquete declarados dentro de un encabezado de paquete sin analizar la especificación del paquete, como lo sugiere @wweicker.