Oracle
 sql >> Database >  >> RDS >> Oracle

contenuto della dichiarazione del pacchetto

Puoi trovare i dettagli sulle funzioni e le procedure in un pacchetto eseguendo una query su TUTTI GLI ARGOMENTI vista dizionario dati o i suoi fratelli USER_ARGUMENTS e DBA_ARGUMENTS.

Ad esempio ho creato il seguente pacchetto:

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;

Ho quindi eseguito la seguente query su di esso:

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

Qui puoi vedere tutti gli argomenti delle funzioni e delle procedure nel nostro pacchetto. Si noti che esiste una voce aggiuntiva con un nome di argomento nullo per il valore restituito per ciascuna delle due funzioni. Inoltre, la procedura che non ha argomenti ha una riga con un nome di argomento nullo e uno zero SEQUENCE valore.

Quindi, per elencare tutte le funzioni, puoi cercare tutte le voci in questa vista con un nome di argomento nullo e una SEQUENCE valore diverso da 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

Elencare le procedure in modo simile è un po' più complicato:

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

Sebbene questo approccio sembri funzionare con procedure e funzioni, non so come elencare le variabili dell'ambito del pacchetto, i tipi e altre cose dichiarate all'interno di un'intestazione di pacchetto senza analizzare le specifiche del pacchetto, come suggerito da @wweicker.