Oui, vous pouvez créer une fonction stockée à cet effet. Quelque chose comme ça :
DELIMITER //
DROP FUNCTION IF EXISTS Haversine //
CREATE FUNCTION Haversine
( myLat FLOAT
, myLong FLOAT
, db_lat FLOAT
, db_long FLOAT
, unit VARCHAR(20)
)
RETURNS FLOAT
DETERMINISTIC
BEGIN
DECLARE haver FLOAT ;
IF unit = 'MILES' --- calculations
SET haver = ... --- calculations
RETURN haver ;
END //
DELIMITER ;
Je ne pense pas qu'il offre des gains de vitesse mais c'est bien pour toutes les autres raisons que vous citez :Lisibilité, réutilisabilité, facilité de maintenance (imaginez que vous trouvez une erreur au bout de 2 ans et que vous devez éditer le code en une (quelques) centaine lieux).