Vamos a transformar el Stored Procedure sp_numero_facturas en una función llamada f_numero_facturas que toma como parámetro la fecha. Decidí mejorar el script con ciertas protecciones contra valores nulos, formatos incorrectos y valores fuera de rango. Aquí está la función:
DELIMITER $$
CREATE FUNCTION f_numero_facturas
(fecha DATE)
RETURNS INT
BEGIN
DECLARE n_facturas INT;
DECLARE error_msg VARCHAR(100);
-- Validar que la fecha no sea nula
IF fecha IS NULL THEN
SET error_msg = 'La fecha no puede ser nula.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_msg;
END IF;
-- Validar el formato de la fecha y el rango adecuado
IF fecha < '1920-01-01' OR fecha > '2025-12-31' THEN
SET error_msg = 'La fecha debe estar en el rango de 1920-01-01 a 2025-12-31.';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_msg;
END IF;
-- Contar el número de facturas para la fecha proporcionada
SELECT COUNT(*) INTO n_facturas
FROM facturas
WHERE FECHA_VENTA = fecha;
RETURN n_facturas;
END $$
DELIMITER ;
Para ejecutar esta función y obtener el número de facturas para una fecha específica, utilizar el comando SELECT de la siguiente manera:
SELECT f_numero_facturas('2017-01-01') AS Numero_Facturas;
Explicación:
DELIMITER $$: Cambia el delimitador de comandos de ; a $$ para permitir definir el bloque de la función.
CREATE FUNCTION f_numero_facturas (fecha DATE) RETURNS INT: Crea una función llamada f_numero_facturas que toma un parámetro de entrada fecha de tipo DATE y devuelve un entero (INT).
DECLARE n_facturas INT: Declara una variable n_facturas de tipo entero para almacenar el número de facturas.
DECLARE error_msg VARCHAR(100): Declara una variable error_msg de tipo VARCHAR(100) para almacenar mensajes de error.
Validación de la Fecha:
5.1. Verifica que la fecha no sea nula. Si es nula, establece un mensaje de error y lanza una señal SQL para interrumpir la ejecución.
5.2. Verifica que la fecha esté en el rango de 1920-01-01 a 2025-12-31. Si no, establece un mensaje de error y lanza una señal SQL para interrumpir la ejecución.
SELECT COUNT() INTO n_facturas FROM facturas WHERE FECHA_VENTA = fecha*: Cuenta el número de facturas para la fecha proporcionada y almacena el resultado en n_facturas.
RETURN n_facturas: Devuelve el número de facturas.
DELIMITER ;: Cambia el delimitador de comandos de vuelta a ;