CREATE DEFINER=`root`@`localhost` PROCEDURE `campo_adicional`(IN mes INT, IN anio INT)
BEGIN
-- Declaración de variables
DECLARE v_cantidad INT;
DECLARE v_precio DECIMAL(10, 2);
DECLARE v_total_facturacion DECIMAL(10, 2) DEFAULT 0;
DECLARE done INT DEFAULT 0;
-- Declaración del cursor
DECLARE factura_cursor CURSOR FOR
SELECT IFa.CANTIDAD, IFa.PRECIO
FROM items_facturas IFa
INNER JOIN facturas F ON F.NUMERO = IFa.NUMERO
WHERE MONTH(F.FECHA_VENTA) = mes AND YEAR(F.FECHA_VENTA) = anio;
-- Manejador para la condición de fin del cursor
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- Abrir el cursor
OPEN factura_cursor;
-- Bucle para recorrer los resultados del cursor
factura_loop: LOOP
FETCH factura_cursor INTO v_cantidad, v_precio;
IF done THEN
LEAVE factura_loop;
END IF;
-- Acumular la facturación
SET v_total_facturacion = v_total_facturacion + (v_cantidad * v_precio);
END LOOP factura_loop;
-- Cerrar el cursor
CLOSE factura_cursor;
-- Mostrar el total de facturación
SELECT v_total_facturacion AS Total_Facturacion;
END
CALL campo_adicional(2, 2015);
Es con parametros, para que sea mas funcional, se pueden buscar datos por mes y año que se desee.
"factura_loop: LOOP"
Esta línea inicia un bucle llamado factura_loop. En SQL, los bucles se utilizan para repetir un bloque de código hasta que se cumpla una condición de salida.
"FETCH factura_cursor INTO v_cantidad, v_precio;"
La instrucción FETCH se utiliza para recuperar la siguiente fila del cursor factura_cursor. Los valores de las columnas seleccionadas (en este caso, CANTIDAD y PRECIO) se almacenan en las variables v_cantidad y v_precio, respectivamente. Si no hay más filas para recuperar, el cursor establece la condición de fin.
"IF done THEN"
Aquí se evalúa la variable done, que es una bandera que indica si se ha llegado al final del cursor. Esta variable se establece en 1 (verdadero) por el manejador de excepciones cuando no hay más filas disponibles en el cursor.
"LEAVE factura_loop;"
Si done es verdadero (es decir, si ya no hay más filas), la instrucción LEAVE se ejecuta, lo que provoca que el bucle factura_loop termine y el control se transfiera a la siguiente instrucción después del bucle.