Funciones (Programación)
Las funciones en bases de datos permiten encapsular lógica y devolver un resultado. Son útiles cuando necesitamos calcular valores, validar datos o reutilizar código en consultas.
1. Diferencias entre Procedimientos y Funciones #
Aunque procedimientos y funciones pueden parecer similares, tienen diferencias clave:
| Característica | Procedimientos | Funciones |
|---|---|---|
| Devuelve valores | Opcional | Siempre devuelve un valor |
Uso en SELECT | ❌ No | ✅ Sí |
Modifica datos (INSERT, UPDATE, DELETE) | ✅ Sí | ❌ No |
Se usa con CALL o EXEC | ✅ Sí | ❌ No |
2. Creación de Funciones en Bases de Datos #
Las funciones pueden devolver:
- Un solo valor (escalar)
- Una tabla completa (tabla)
Ejemplo: Función Escalar #
Esta función recibe un ID de empleado y devuelve su salario.
3. Funciones que Devuelven una Tabla #
A veces necesitamos que una función devuelva varias filas en lugar de un solo valor.
Ejemplo: Función que Devuelve Empleados de un Departamento #
4. Control de Flujo en Funciones #
Podemos usar estructuras como IF, CASE, LOOP, etc.
Ejemplo: Función que Evalúa el Nivel de Salario #
Esta función clasifica los salarios en Bajo, Medio o Alto.
5. Manejo de Errores en Funciones #
Podemos capturar errores para evitar fallos en la ejecución.
6. Optimización de Funciones #
Para mejorar el rendimiento:
✅ Usar índices en las columnas consultadas.
✅ Evitar cursores cuando no sean necesarios.
✅ Usar funciones inmutables (DETERMINISTIC en MySQL, STABLE en PostgreSQL).
Ejemplo de optimización:
1SELECT nombre FROM empleados WHERE departamento_id = 3 LIMIT 10;
7. Ejemplo Completo #
Vamos a crear una función que calcula el descuento de un producto según su precio.
8. DETERMINISTIC vs NOT DETERMINISTIC #
La palabra clave DETERMINISTIC en MySQL se utiliza al definir funciones o procedimientos almacenados para indicar que el resultado de la función será siempre el mismo, dado un conjunto específico de parámetros de entrada. En otras palabras, una función determinista siempre devolverá el mismo resultado para los mismos valores de entrada.
¿Qué significa y cómo se utiliza? #
-
DETERMINISTIC: Significa que la función no depende de factores externos, como la fecha y hora actuales, el estado del sistema o cualquier dato que pueda cambiar entre ejecuciones. El valor de retorno de la función será predecible y consistente cuando se le pase el mismo conjunto de parámetros.
-
NOT DETERMINISTIC: Si una función puede devolver resultados diferentes con el mismo conjunto de parámetros (por ejemplo, si depende de la hora del sistema o de variables globales que cambian), se debe usar
NOT DETERMINISTIC. Esto es útil cuando se sabe que la función puede generar resultados variables incluso para los mismos parámetros.
Ejemplo: #
Función Determinista #
1CREATE FUNCTION CalcularAreaRectangulo(base INT, altura INT) 2RETURNS INT 3DETERMINISTIC 4BEGIN 5 RETURN base * altura; 6END;
- En este caso, la función
CalcularAreaRectanguloes determinista porque, para cualquier par de valoresbaseyaltura, el resultado será siempre el mismo (el área del rectángulo).
Función No Determinista #
1CREATE FUNCTION ObtenerFechaActual() 2RETURNS DATETIME 3NOT DETERMINISTIC 4BEGIN 5 RETURN NOW(); 6END;
Resumen del tema
Conceptos clave #
- Funciones Definidas por el Usuario (UDF): rutinas que siempre retornan un valor y pueden ser invocadas directamente dentro de sentencias
SELECT,WHEREoORDER BY. - Tipos de Retorno:
- Escalares: devuelven un único valor puntual (número, texto, fecha).
- De Tabla: devuelven un conjunto de filas estructuradas como una tabla virtual (
RETURNS TABLEoSYS_REFCURSOR).
- Determinismo (
DETERMINISTIC): indica que para los mismos parámetros la función siempre devuelve el mismo resultado, permitiendo optimizaciones de caché por el motor. - Restricciones: generalmente no deben modificar el estado de la base de datos (no ejecutar
INSERT,UPDATEoDELETEsobre tablas de datos) cuando se usan dentro de consultas.
Qué debes recordar #
Las funciones se integran directamente en las consultas SQL para calcular o transformar datos fila a fila; declarar correctamente su determinismo es crucial para que el optimizador no degrade el rendimiento.