Oracle db mesa de vista / sistema para comprobar si se le da parte de un paquete es un procedimiento o una función
-
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
.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.