Você pode encontrar detalhes sobre as funções e procedimentos em um pacote consultando o ALL_ARGUMENTS visão de dicionário de dados, ou seus irmãos USER_ARGUMENTS e DBA_ARGUMENTS.
Para um exemplo eu criei o seguinte pacote:
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;
Em seguida, executei a seguinte consulta nele:
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
Aqui você pode ver todos os argumentos para as funções e procedimentos em nosso pacote. Observe que há uma entrada extra com um nome de argumento nulo para o valor de retorno de cada uma das duas funções. Além disso, o procedimento que não tem argumentos tem uma linha com um nome de argumento nulo e um
SEQUENCE
zero valor. Portanto, para listar todas as funções, você pode pesquisar todas as entradas nesta visualização com um nome de argumento nulo e uma
SEQUENCE
valor diferente 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
Listar procedimentos de maneira semelhante é um pouco mais 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
Embora essa abordagem pareça funcionar com procedimentos e funções, não sei como listar as variáveis de escopo de pacote, tipos e outras coisas declaradas em um cabeçalho de pacote sem analisar a especificação do pacote, conforme sugerido por @wweicker.