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.