|
|
| Productos Soluciones Soporte y Servicios Contáctenos | MySybase Sybase.com |
|
Entendiendo las Funciones de Usuario en Adaptive Server Enterprise
IntroducciónLa versión 15.0.2 de Adaptive Server Enterprise (ASE) incorpora la posibilidad de crear funciones SQL de usuario (también llamadas SQL User Defined Functions o símplemente SQL UDF). Las funciones de usuario, en contraste a las funciones SQLJ (ver Uso de Métodos Java como Funciones y Procedimientos Almacenados SQLJ en Adaptive Server Enterprise), son rutinas construidas con una o más sentencias Transact-SQL y que encapsulan lógica de aplicación. Hasta ahora, ASE había soportado funciones del sistema, tales como getdate(), object_name() y object_id(), pero no le daba al usuario la capacidad de crear nuevas funciones. La versión 15.0.2 extiende el comando create function, permitiendo ahora crear funciones de usuario (en adición a las funciones SQLJ). Para ésta versión las funciones de usuario son “escalares”, lo cual quiere decir que están en capacidad de arrojar un solo valor, de cualquier tipo. Obviamente, los procedimientos almacenados tradicionales también pueden arrojar un valor (usando la sentencia return o parámetros out), pero éstos no se pueden usar en un select ni como parte de una expresión de una cláusula where, índice funcional, ni columna computada, lo que es un claro indicio de porqué necesitamos las funciones de usuario. Adicionalmente, la sentencia return de las funciones de usuario, puede retornar cualquier tipo de dato, como lo veremos más adelante. El Comando create functionLa sintaxis básica del comando create function para funciones de usuario es la siguiente:
Para invocar la función de usuario se usa la siguiente sintaxis:
Hay que anotar que el uso del prefijo “dueño.” es obligatorio. Veamos un ejemplo sencillo; la siguiente función determina el último día del mes, dada una fecha:
Una vez creada la función, uno puede invocarla de la siguiente manera:
También uno podría usar la función como parte de una expresión del where de una sentencia select:
Valores Predeterminados para los ParámetrosDe manera similar a los procedimientos almacenados convencionales, es posible definir valores predeterminados para los parámetros de las funciones; por ejemplo, para la siguiente función el parámetro @b tomaría el valor 0, si no se especifica ningún valor para éste al invocar la función:
Para poder hacer uso del valor predeterminado, se utiliza la palabra clave default:
Las funciones de usuario no permiten (al contrario de los procedimientos almacenados) omitir parámetros; al hacerlo se genera un mensaje de error como el siguiente:
Columnas Computadas e Índices FuncionalesComplementando la habilidad de ASE 15 de crear columnas computadas e índices funcionales, en la versión 15.0.2 es posible usar funciones de usuario como base de dichas definiciones. Este es un ejemplo de una columna computada que usa la función de usuario UltimoDiaDelMes(), creada arriba:
Y si quisiéramos usar la misma función como parte de la definición de un índice funcional, ejecutaríamos algo como:
RecursividadMuchos se preguntarán si es posible crear funciones recursivas en ASE. La respuesta es si, pero se requiere de un “truco” para hacerlo. Pensemos en el ejemplo típico de la función factorial(); lo primero que se vendría a la mente es algo así:
Sin embargo, aunque el código anterior debería funcionar, ASE genera el siguiente mensaje de error:
El mensaje indica que la funcion dbo.factorial() no existe. Es decir, no es posible crear una función que invoque otra que no exista (como ella misma). Entonces ¿qué hacer? Básicamente lo que debemos hacer es lo siguiente: 1. Crear una función “auxiliar” con el mismo número y tipo de parámetros que nuestra función y que arroje el mismo tipo de dato; el código NO debe ser recursivo y puede ser tan sencillo como arrojar una expresión constante:
2. Crear nuestra función recursiva, pero invocando, en donde se hace el llamado recursivo, la función auxiliar que se creó en el punto 1:
3. Eliminar la función auxiliar y volverla a crear usando el mismo código de la función principal creada en el punto 2 e invocando dicha función en el llamado recursivo:
4. Como resultado, tenemos una función recursiva que podemos invocar así:
Es importante recalcar que el uso de funciones recursivas puede ser exigente desde el punto de vista de uso recursos, así que es posible que sea necesario aumentar el parámetro estático stack size de ASE, usando el procedimiento sp_configure. Tipos de Dato de UsuarioComo lo mencionamos antes, una función de usuario puede retornar cualquier tipo de dato, incluyendo un tipo de dato de usuario. Por ejemplo, la siguiente función usa el tipo de dato ShortString, definido como tipo de dato de usuario:
Para invocar la función haríamos lo siguiente:
PermisosAl igual que con los procedimientos almacenados, es posible conceder o revocar permisos de ejecución de una función a otros usuarios, grupos o roles, usando los comandos grant y revoke. En el siguiente ejemplo se otorga permiso de ejecución sobre la función func1 al grupo public:
Funciones “Globales”Como sabemos, los procedimientos almacenados del sistema (cuyo nombre comienza por “sp_” y se almacenan en la base de datos sybsystemprocs) pueden ser invocados desde cualquier base de datos. Usando ésta misma regla (aunque ésta capacidad no está documentada), podríamos entonces crear una función “global”, así: 1. Crear la función en la base de datos sybsystemprocs, usando el prefijo “sp_” en su nombre:
2. Usar la función sp_func1() desde cualquier otra base de datos:
El comando drop functionLa versión 15.0.2 extiende la funcionalidad del comando drop function, soportando ahora funciones de usuario (versiones anteriores sólo soportaban funciones SQLJ):
|
|||||||||||||||||||||||||||||||||||||||||||||||
| Inicio Sobre MTBASE Sobre Sybase Empleos en MTBASE Mapa del Sitio Mail Corp. Aspectos Legales y Políticas de Privacidad |