Oracle db mesa de vista / sistema para comprobar si se le da parte de un paquete es un procedimiento o una función

StackOverflow https://stackoverflow.com/questions/2343401

  •  23-09-2019
  •  | 
  •  

Pregunta

Estoy utilizando el Oracle tablas del sistema para conseguir un poco de metadatos sobre el Los paquetes en nuestra base de datos.

Esta es una de mis preguntas:

select AP.PROCEDURE_NAME
  from ALL_PROCEDURES ap
 where ap.object_name = :object_name
   and ap.owner=:owner
   and ap.procedure_name is not NULL
   and ap.procedure_name like :procedure_name

También quieren saber si el objeto dado es o bien una función, un procedimiento o un tipo. Parece que no puedo encontrar una manera directa para extraer los datos directamente de una mesa.

Nota: No quiero tener que analizarlo desde all_sources

.
¿Fue útil?

Solución

Resulta que hay una vista all_arguments donde se puede obtener todos los parámetros de un método en un paquete. Cuando el método es una función hay una discusión con un nombre null que representa el valor de retorno. Así que si se inscribe en contra all_arguments se puede determinar si una entrada all_procedures dado es una función o un procedimiento. Lo que sigue es un ejemplo que muestra como una selecta.

select CASE (Select count(*) from ALL_ARGUMENTS aa 
                       where aa.object_name=ap.procedure_name
                         and aa.object_id = ap.object_id 
                         and argument_name is null)
         WHEN 1 THEN 'FUNCTION'
         WHEN 0 THEN 'PROCEDURE'
         ELSE ''
       END as is_function, ap.*
  from all_procedures ap
 where ap.object_name like '<package name>'

Otros consejos

SQL> select distinct object_type from user_procedures;

OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION

sospecho uno no tendrá ninguna opción. Al menos es bien formateado -. Todos los tipos comienzan con el tipo, y así sucesivamente

Se puede utilizar SQL * Plus y el comando DESC, que funciona en paquetes:

SQL> desc dbms_application_info;
PROCEDURE READ_CLIENT_INFO
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CLIENT_INFO                    VARCHAR2                OUT
PROCEDURE READ_MODULE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 MODULE_NAME                    VARCHAR2                OUT
 ACTION_NAME                    VARCHAR2                OUT
PROCEDURE SET_ACTION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ACTION_NAME                    VARCHAR2                IN
PROCEDURE SET_CLIENT_INFO
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CLIENT_INFO                    VARCHAR2                IN
PROCEDURE SET_MODULE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 MODULE_NAME                    VARCHAR2                IN
 ACTION_NAME                    VARCHAR2                IN
PROCEDURE SET_SESSION_LONGOPS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 RINDEX                         BINARY_INTEGER          IN/OUT
 SLNO                           BINARY_INTEGER          IN/OUT
 OP_NAME                        VARCHAR2                IN     DEFAULT
 TARGET                         BINARY_INTEGER          IN     DEFAULT
 CONTEXT                        BINARY_INTEGER          IN     DEFAULT
 SOFAR                          NUMBER                  IN     DEFAULT
 TOTALWORK                      NUMBER                  IN     DEFAULT
 TARGET_DESC                    VARCHAR2                IN     DEFAULT
 UNITS                          VARCHAR2                IN     DEFAULT

Por iterar sobre los paquetes, y el análisis de los resultados - es una estructura más fácil de analizar que DBA_SOURCE - es posible conseguir lo que quieres. Una advertencia para recordar; paquetes soporta la sobrecarga de lo que podría tener tanto FUNCTION foo(date) RETURN date y PROCEDURE foo(varchar). Coincidencia sólo por su nombre puede no ser suficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top