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:
Publicar un comentario