Estás usando el mismo nombre para la variable del parámetro de entrada que para el nombre del campo.
Es mejor evitar eso porque MySQL puede confundirse al interpretar los nombres.
Como el nombre del campo tiene prioridad por jerarquía de objetos, entonces el falor que asume es el de campo y no el de variable. Esto implica que la comparación FECHA = Fecha se hace con el valor del campo FECHA sobre si mismo... lo que siempre es TRUE. Por eso te está devolviendo todos los registros.
Pon mejor algo así:
Código sql:
Ver originalDEMILITER GO;
DROP PROCEDURE IF EXISTS insertDistance;
GO
CREATE PROCEDURE insertDistance(IN vfecha DATE)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE id INTEGER;
DECLARE lat DOUBLE;
DECLARE lng DOUBLE;
DECLARE curPuntos CURSOR FOR
SELECT ID_RECORRIDO_VEHICULO, LATITUD, LONGITUD
FROM recorrido_vehiculo
WHERE FECHA=vfecha;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN curPuntos;
REPEAT
FETCH curPuntos INTO id,lat,lng;
IF NOT done THEN
INSERT INTO tmp (ID,LATITUD,LONGITUD,FECHA) VALUES (id,lat,lng,vfecha);
END IF;
UNTIL done END REPEAT;
CLOSE curPuntos;
END
GO
DELIMITER ;