Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

conteúdo da declaração do pacote


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.