Funciones almacenadas en MySQL: CREATE FUNCTION, RETURN y diferencias con PROCEDURE


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

  1. función para duplicar un número;
  2. calcular IVA;
  3. aplicar descuento;
  4. clasificar nota;
  5. 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:

☕ Apoyar con Mercado Pago

🌎 Apoyar con PayPal


Ruta SQL / MySQL

Ver todos los contenidos de SQL / MySQL

← Procedimientos almacenados

Triggers en 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”

Deja un comentario

Descubre más desde Club Programador

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo