sql >> Databasteknik >  >> RDS >> Oracle

innehållet i förpackningsdeklarationen

Du kan hitta detaljer om funktionerna och procedurerna i ett paket genom att fråga ALLA_ARGUMENT dataordbokvy, eller dess bröder USER_ARGUMENTS och DBA_ARGUMENTS.

Som ett exempel skapade jag följande paket:

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;

Jag körde sedan följande fråga mot den:

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

Här kan du se alla argument till funktionerna och procedurerna i vårt paket. Observera att det finns en extra post med ett null-argumentnamn för returvärdet för var och en av de två funktionerna. Dessutom har proceduren som inte har några argument en rad med ett null-argumentnamn och en noll SEQUENCE värde.

Så för att lista alla funktioner kan du söka efter alla poster i den här vyn med ett null-argumentnamn och en SEQUENCE värde inte lika med 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

Att lista procedurer på ett liknande sätt är lite knepigare:

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

Även om det här tillvägagångssättet verkar fungera med procedurer och funktioner, vet jag inte hur jag ska lista paketomfångsvariabler, typer och andra saker som deklareras i en pakethuvud utan att analysera paketspecifikationen, som föreslagits av @wweicker.



  1. SQLite JSON()

  2. Påskynda mysql dumpningar och importer

  3. Laravel 4 - JOIN - Samma kolumnnamn

  4. Dynamiskt (kolumnbaserat) intervall