Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Inhalt der Packstückerklärung

Details zu den Funktionen und Prozeduren in einem Paket finden Sie, indem Sie ALLE_ARGUMENTE Datenwörterbuchansicht oder ihre Brüder USER_ARGUMENTS und DBA_ARGUMENTS.

Als Beispiel habe ich das folgende Paket erstellt:

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;

Ich habe dann die folgende Abfrage dagegen ausgeführt:

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

Hier sehen Sie alle Argumente zu den Funktionen und Prozeduren in unserem Paket. Beachten Sie, dass für jede der beiden Funktionen ein zusätzlicher Eintrag mit einem Nullargumentnamen für den Rückgabewert vorhanden ist. Außerdem hat die Prozedur, die keine Argumente hat, eine Zeile mit einem leeren Argumentnamen und einer SEQUENCE von Null Wert.

Um also alle Funktionen aufzulisten, könnten Sie in dieser Ansicht nach allen Einträgen mit einem Nullargumentnamen und einem SEQUENCE suchen Wert ungleich 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

Das Auflisten von Prozeduren auf ähnliche Weise ist etwas kniffliger:

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

Obwohl dieser Ansatz mit Prozeduren und Funktionen zu funktionieren scheint, weiß ich nicht, wie ich die Variablen, Typen und andere Dinge im Paketbereich auflisten soll, die in einem Paketheader deklariert sind, ohne die Paketspezifikation zu analysieren, wie von @wweicker vorgeschlagen.