Bien, finalmente encontré los problemas que generaban el error:
1) La variable "done" estaba creada, pero no inicializada, por lo que su valor real era NULL y en ese caso todo el proceso del IF falla. No se puede hacer un IF contra un NULL, sino contra una función para NULLs.
2) Resuelto eso, la cantidad de valores a ingresar en esa tabla no se corresponde con la cantidad de columnas de la tabla. En ese caso lo que corresponde hacer es o bien poner ,todos los valores necesarios, o indicar los valores que se usarán.
Quedó finalmente así:
Código MySQL:
Ver originalDELIMITER $$
/* ------------------------------------------------------------------------------- */
DECLARE CUR_VENTAS_CLIENTE_REPRE CURSOR FOR
SELECT ANYTRA
,MESTRA
,InformarNombreMes
(MESTRA
) AS NOMMES
,NCUENTA
,NOMCLIENTE
,REPRE
AS CODREPRE
,NOMREPRE
,SUM(IMPNET
) AS MES_ACTUAL_IMP
,COUNT(*) AS MES_ACTUAL_CANT
, GROUP BY ANYTRA
,MESTRA
,NCUENTA
,NOMCLIENTE
,CODREPRE
,NOMREPRE
; /* ------------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------------- */
OPEN CUR_VENTAS_CLIENTE_REPRE;
/* ------------------------------------------------------------------------------- */
FETCH CUR_VENTAS_CLIENTE_REPRE
INTO VANYTRA,
VMESTRA,
VNOMMES,
VNCUENTA,
VNOMCLIENTE,
VCODREPRE,
VNOMREPRE,
VMES_ACTUAL_IMP,
VMES_ACTUAL_CANT,
VIMPBRU,
VDTOFAM,
VDTOART,
VDTOCAB,
VDTOOTR,
VPRECIO,
VPRECOS;
/* ------------------------------------------------------------------------------- */
/* Inserción de los registros de referencia agrupados por CLIENTE y REPRE */
/* ------------------------------------------------------------------------------- */
ANYTRA,
MESTRA,
NOMMES,
NCUENTA,
NOMCLIENTE,
CODREPRE,
NOMREPRE,
MES_ACTUAL_IMP,
MES_ACTUAL_CANT,
IMPBRU,
DTOFAM,
DTOART,
DTOCAB,
DTOOTR,
PRECIO,
PRECOS)
(VANYTRA,
VMESTRA,
VNOMMES,
VNCUENTA,
VNOMCLIENTE,
VCODREPRE,
VNOMREPRE,
VMES_ACTUAL_IMP,
VMES_ACTUAL_CANT,
VIMPBRU,
VDTOFAM,
VDTOART,
VDTOCAB,
VDTOOTR,
VPRECIO,
VPRECOS);
/* ------------------------------------------------------------------------------- */
CLOSE CUR_VENTAS_CLIENTE_REPRE;
/* ------------------------------------------------------------------------------- */
INTO VANYTRA
, VMESTRA
, VNOMMES
; /* ------------------------------------------------------------------------------- */
SELECT VANYTRA
, VMESTRA
, VNOMMES
;
DELIMITER ;
La última parte es una adaptación de lo que pusiste para que devuelva algo.
Queda pendiente resolver lo de las PK de las tablas, ya que no se está controlando la unicidad de valores.
Tampoco hay un buen uso de la programación de SP y SF en algunos casos, en los que se están haciendo operaciones innecesariamente complicadas, como por ejemplo en la función `InformarNombreMes`, que yo escribiría así:
Código MySQL:
Ver originalDELIMITER $$
RETURN 'ENE';
RETURN 'FEB';
RETURN 'MAR';
RETURN 'ABR';
RETURN 'MAY';
RETURN 'JUN';
RETURN 'JUL';
RETURN 'AGO';
RETURN 'SEP';
RETURN 'OCT';
RETURN 'NOV';
RETURN 'DIC';
RETURN 'NO INFORMADO';
DELIMITER ;
Es un poco más limpio y al parser le resulta más eficiente.