Estuve mirando este hilo ayer pero no sabía por donde cogerlo.
El problema que veo es que haces un For select, y eso es un for para cada registro de la tabla, después, en su select vuelves a realizar otro select que suma:
Código SQL
[-]SELECT SUM(GS) FROM HONDATA WHERE IDHONDATA = H.IDHONDATA) AS GS
No sé, pero quizás fuese mejor realizar 3 selects distintos obteniendo las sumas:
Código SQL
[-]
CREATE PROCEDURE TRAE3 (
FECHAINI DATE,
FECHAFIN DATE)
RETURNS (
GS FLOAT,
MEC INTEGER,
SER INTEGER,
TC INTEGER)
AS
BEGIN
SELECT SUM(GS) FROM HONDATA WHERE IDHONDATA = H.IDHONDATA) as GS
FROM ENCAOR E, HONDATA H
WHERE E.TIPO <> 'C' AND E.FECH BETWEEN :FECHAINI AND :FECHAFIN
AND E.ORDE = H.ORDE AND EXTRACT(MONTH FROM (H.FECHORDE)) = EXTRACT(MONTH FROM(:FECHAFIN))
and GS is not null
INTO :GS
...
-----------la otra sqls aqui -------
SELECT COUNT(R.IDRETSER) FROM RETMR R AS TC
FROM ENCAOR E, HONDATA H
WHERE R.IDHONDATA = H.IDHONDATA AND R.IDRETSER = 3)
and E.TIPO <> 'C' AND E.FECH BETWEEN :FECHAINI AND :FECHAFIN
AND E.ORDE = H.ORDE AND EXTRACT(MONTH FROM (H.FECHORDE)) = EXTRACT(MONTH FROM(:FECHAFIN))
into :TC
--- y después de tener todos los datos, devolvemos un único registro -----
SUSPEND;
END^
SET TERM ; ^
Saludos