sql >> Base de Datos >  >> RDS >> Oracle

contenido de la declaración del paquete

Puede encontrar detalles sobre las funciones y procedimientos en un paquete consultando TODOS_ARGUMENTOS vista de diccionario de datos, o sus hermanos USER_ARGUMENTS y ​​DBA_ARGUMENTS.

Para un ejemplo, creé el siguiente paquete:

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;

Luego ejecuté la siguiente consulta en su contra:

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

Aquí puede ver todos los argumentos de las funciones y procedimientos en nuestro paquete. Tenga en cuenta que hay una entrada adicional con un nombre de argumento nulo para el valor de retorno de cada una de las dos funciones. Además, el procedimiento que no tiene argumentos tiene una fila con un nombre de argumento nulo y un cero SEQUENCE valor.

Entonces, para enumerar todas las funciones, puede buscar todas las entradas en esta vista con un nombre de argumento nulo y una SEQUENCE valor no igual a 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

Enumerar los procedimientos de manera similar es un poco más 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

Si bien este enfoque parece funcionar con procedimientos y funciones, no sé cómo enumerar las variables, los tipos y otras cosas del alcance del paquete declarados dentro de un encabezado de paquete sin analizar la especificación del paquete, como lo sugiere @wweicker.