Pues en realidad la respuesta es bastante simple: Estás abriendo el segundo cursor
dentro del LOOP donde lo vas a usar, cuando deberías abrirlo fuera.
El segundo ciclo que se produzca intenta abrir nuevamente un cursor que ya está abierto.
Código MySQL:
Ver originalcrs_cod_pro_loop:LOOP
OPEN crs_cod_prod; -- Estas abriendo el cursor dentro del LOOP
fetch crs_cod_prod
INTO cod_producto
, nombre_producto
,costo
,nit
; INSERT INTO informe
VALUES('',fecha_factura
,cod_producto
,nombre_producto
,costo
,nit
); close crs_cod_prod;
leave crs_cod_pro_loop;
END LOOP crs_cod_pro_loop
;
Como notas adicionales, te recomiendo no crear tablas puras, ni tablas memory para uso temporal. Usa tablas TEMPORARY, en las que no se indica el ENGINE.
Extensivamente, yo ni siquiera usaría cursores para toda la tarea que haces, pero eso sería mi solución.