Por empezar, al menos hay un error conceptual: No puedes cerrar las iteraciones cruzadas.
Si abres LOOP 1 y LOOP 2, estando el segundo dentro del primero ,
siempre deben cerrarse o enviar a ciclo nuevo
en el orden inverso, es decir respetando el anidamieento del proceso.
Me refiero puntualmente a esto:
Código MySQL:
Ver originalcrs_num_fact_loop:LOOP
...
crs_cod_pro_loop:LOOP -- segundo LOOP donde realiza el la busqueda de nombre de productos, codigo y costo.
...
IF total_registro
>= crs_num_fact
THEN ...
iterate crs_num_fact_loop; -- cierra el primer LOOP <-- Cierre cruzado. Orden incorrecto
iterate crs_cod_pro_loop; -- cierra el segundo LOOP
END LOOP crs_cod_pro_loop
;
Adicionalmente, tienes esto:
Código MySQL:
Ver originalOPEN cursor_suma;
...
OPEN crs_num_fact;
crs_num_fact_loop:LOOP -- LOOP donde recorrera las fechas que se filtraron
...
crs_cod_pro_loop:LOOP
OPEN crs_cod_prod; -- abre el LOOP <.. No abre un loop, abre un CURSOR
FETCH crs_cod_prod
INTO cod_producto
, nombre_producto
,costo
,nit
; INSERT INTO informe
VALUES('',fecha_factura
,cod_producto
,nombre_producto
,costo
,nit
); IF total_registro
>= crs_num_fact
THEN CLOSE csr_num_fact; -- <-- Caso 1
CLOSE csr_cod_prod; -- <-- Caso 2
...
END LOOP crs_cod_pro_loop
;
Caso 1: Cierras un CURSOR que abriste fuera del loop. El loop fallará por el cursor cerrado
Caso 2: Cierras un CURSOR que abriste dentro del loop. Cada iteración vovlera a abrirlo y reeejecutar la query desde el principio. No tiene sentido.
Además no has dejado el HANDLER, por lo que cualquier fallo de cualquier tipo producirá problemas no administrados.
En las FAQs de MySQL yo postee
un ejemplo detallado hace ya bastante tiempo, que te puede servir de referencia para ver mejor el tema. En cualquier caso, no te olvides que en los anidamientos se debe respetar la secuencia de aperturas y cierres.
Finalmente, un consejo: En muchísimos casos he visto que una secuencia de queries a tablas temporales son más eficientes que usar cursores. Yo estimo (no puedo hacer pruebas en este momento porque no estoy en casa), que tal vez rediseñando las consultas podrías llegar a obtener iguales resultados sin necesidad de ellos.