Una función almacenada es un bloque de lógica guardado en MySQL que recibe parámetros y devuelve un valor.
¿Qué problema resuelve una función?
Una función encapsula un cálculo que produce un valor. Ese cálculo puede reutilizarse en SELECT, WHERE, ORDER BY u otras expresiones.
Ejemplos típicos: calcular un impuesto, aplicar una regla matemática o devolver una clasificación.
¿En qué se diferencia de un procedimiento?
Una función se usa dentro de expresiones SQL y devuelve un único valor. Un procedimiento se ejecuta con CALL y está más orientado a procesos.
La forma de pensarla es similar a una función de programación tradicional: recibe argumentos y produce un resultado.
Primera función
DELIMITER // CREATE FUNCTION sumar(p_a INT, p_b INT) RETURNS INT DETERMINISTIC BEGIN RETURN p_a + p_b; END // DELIMITER ;
Parámetros de una función
Los parámetros aparecen entre paréntesis después del nombre. Cada uno necesita un nombre y un tipo.
En sumar(p_a INT, p_b INT), la función recibe dos enteros.
RETURNS
Declara el tipo de dato que devuelve la función.
Ese tipo debe ser compatible con el valor que finalmente entregue RETURN.
RETURNS DECIMAL(10,2)
RETURN
Entrega el valor final.
RETURN p_a + p_b;
RETURN termina la función
Cuando MySQL alcanza RETURN, obtiene el valor de salida de esa ejecución.
DETERMINISTIC
Indica que, con los mismos valores de entrada, la función devuelve siempre el mismo resultado.
Por ejemplo, una función que suma 10 + 5 siempre devuelve 15. Una función basada en la fecha actual no tendría esa característica.
Usar una función en SELECT
SELECT sumar(10, 5);
Función para calcular IVA
CREATE FUNCTION calcular_iva( p_importe DECIMAL(10,2), p_porcentaje DECIMAL(5,2) ) RETURNS DECIMAL(10,2) DETERMINISTIC BEGIN RETURN p_importe * p_porcentaje / 100; END
Aplicar una función a cada fila
SELECT nombre, precio, calcular_iva(precio, 21) AS iva FROM productos;
La función se ejecuta para cada fila procesada.
Si la consulta devuelve 100.000 productos, la función podría evaluarse 100.000 veces. Por eso una función cómoda desde el punto de vista del código puede tener un costo importante.
Función con IF
IF p_edad >= 18 THEN RETURN 'Mayor de edad'; ELSE RETURN 'Menor de edad'; END IF;
Variables locales
DECLARE v_descuento DECIMAL(10,2);
Función que consulta una tabla
CREATE FUNCTION cantidad_alumnos_curso(p_curso_id INT) RETURNS INT READS SQL DATA BEGIN DECLARE v_total INT; SELECT COUNT(*) INTO v_total FROM alumnos WHERE curso_id = p_curso_id; RETURN v_total; END
Usar funciones en WHERE
Es posible, pero puede afectar el rendimiento o impedir aprovechar índices.
Funciones y efectos secundarios
Conceptualmente una función es más fácil de mantener cuando se comporta como un cálculo: recibe datos y devuelve un valor. Para procesos que modifican muchas tablas o ejecutan flujos complejos suele ser más claro usar procedimientos o la lógica de aplicación.
Función vs procedimiento
- Función: devuelve un valor y puede participar en SELECT.
- Procedimiento: se ejecuta con CALL y puede representar procesos con varias operaciones.
Eliminar una función
DROP FUNCTION IF EXISTS sumar;
Rendimiento
Una función aplicada a millones de filas puede ejecutarse millones de veces. Conviene medir su costo.
Errores comunes
- olvidar RETURNS;
- devolver un tipo incompatible;
- usar una función para un proceso complejo;
- aplicar funciones sobre columnas indexadas sin analizar impacto.
Ejercicios
- función para duplicar un número;
- calcular IVA;
- aplicar descuento;
- clasificar nota;
- contar alumnos de un curso.
¿Qué sigue?
Triggers en MySQL.
¿Te sirvió esta guía? ☕
Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:
Ruta SQL / MySQL
Ver todos los contenidos de SQL / MySQL
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
Un comentario en “Funciones almacenadas en MySQL: CREATE FUNCTION, RETURN y diferencias con PROCEDURE”