Anuncios en tutorial de programación PLSQL

martes, 29 de mayo de 2018

Vistas USER_ARGUMENTS y DBA_ARGUMENTS para analizar los argumentos de funciones y procedimientos

USER_ARGUMENTS y DBA_ARGUMENTS son dos vistas realmente útiles para los programadores de PL/SQL. Contienen información sobre los argumentos, también llamados parámetros, de cada uno de los programas almacenados en nuestro esquema (USER_ARGUMENTS) o en toda la base de datos Oracle (DBA_ARGUMENTS, el acceso a esta vista suele estar restringido a los administradores de la base de datos). Al mismo tiempo, ofrece una gran cantidad de información muy bien diseccionada y estructurada.

USER_ARGUMENTS y DBA_ARGUMENTS

Las columnas clave de esta vista son:
  • OWNER (solo en DBA_ARGUMENTS): Nombre del esquema propietario del procedimiento o función PL/SQL.
  • OBJECT_NAME: Nombre del procedimiento o función.
  • PACKAGE_NAME: Nombre del paquete PL/SQL dentro del cual se ha definido el procedimiento o función.
  • ARGUMENT_NAME: Nombre del argumento o parámetro.
  • POSITION: Posición del argumento dentro de la lista de parámetros. Si toma el valor 0, hace referencia a la cláusula RETURN dentro de una función.
  • IN_OUT: Indica si el argumento es de entrada o salida o permite ambos modos (IN - entrada, OUT - salida, IN OUT - entrada salida).
  • DATA_TYPE: El tipo de dato del argumento.
  • DATA_LEVEL: El nivel de anidamiento del argumento para tipos compuestos. Por ejemplo, si uno de los parámetros es de tipo registro, la vista USER_ARGUMENTS incluirá una entrada para este argumento con un DATA_LEVEL de 0 y diversas entradas con un DATA_LEVEL de 1 para cada campo de dicho registro.

A continuación os dejo algunos ejemplos de consultas que utilizan la vista USER_ARGUMENTS.

Funciones con parámetros OUT o IN OUT


Una recomendación que muchos expertos en programación PL/SQL señalan y casi seguro que has escuchado alguna vez, es el hecho de indicar que las funciones solo deben incluir argumentos de tipo entrada (IN). El motivo es sencillo, las funciones PL/SQL que contienen parámetros de salida (OUT) o entrada salida (IN OUT) no pueden invocarse desde una sentencia SQL, y tampoco pueden utilizarse dentro de un índice basado en una función. Cuando se necesita que un programa devuelva múltiples datos, la recomendación es utilizar un procedimiento o que la cláusula RETURN devuelva un registro.

Esta sencilla consulta permite encontrar todas las funciones definidas en nuestro esquema que no cumplen con esta norma de buenas prácticas

SELECT 
 ua.package_name, 
 ua.object_name, 
 ua.position, 
 ua.argument_name, 
 ua.in_out
FROM 
 (SELECT * FROM user_arguments WHERE position = 0) funcs, 
 user_arguments ua
WHERE ua.in_out IN ('OUT', 'IN OUT')
 AND ua.position > 0
 AND ua.data_level = 0
 AND funcs.object_name = ua.object_name
 AND funcs.package_name = ua.package_name
 AND NVL(funcs.overload,'NULL') = NVL(ua.overload,'NULL')
ORDER BY 1, 2, 3;

En la consulta podéis ver que he definido una vista inline dentro de la cláusula FROM que identifica todos los programas que incluyen cláusulas RETURN (position = 0) y que, por tanto, se tratan de funciones PL/SQL. En la cláusula WHERE limito la salida a aquellos registros que son de salida o de entrada salida, que no se tratan de cláusulas RETURN y cuyo nivel de anidamiento es cero. Las otras condiciones son necesarias para unir la vista inline FUNCS con la vista USER_ARGUMENTS.

Nota: La columna overload será distinto de NULL cuando el paquete PL/SQL que la contiene, incluya dos o más subprogramas con el mismo nombre.

Programas con argumentos tipo LONG


Supongamos que queremos encontrar todos los programas de nuestro esquema que incluyen un argumento de tipo LONG (un tipo de dato que se utiliza para almacenar cadenas de caracteres muy largas, de más de cuatro mil caracteres). Esto puede interesarnos ya que Oracle recomienda que todos los parámetros y variables de tipo LONG sean reemplazados por el tipo de datos CLOB que permite almacenar en la base de datos Oracle tipos de objeto de gran tamaño entre los que se incluyen objetos de tipo carácter. Con esta sencilla consulta podemos encontrar todos los argumentos que utilizan el tipo de dato LONG para proceder a su reemplazo:

SELECT
 ua.package_name,
 ua.object_name,
 ua.position,
 ua.argument_name
FROM user_arguments ua
WHERE ua.data_type = 'LONG'
ORDER BY 1, 2, 3;

Para aquellos que quieran, pueden utilizar la sección de comentarios para añadir cualquier otro uso que consideren útil de las vistas USER_ARGUMENTS y DBA_ARGUMENTS, o para cualquier pregunta sobre estas vistas.

0 comentarios: