Sì, è possibile creare una funzione memorizzata per questo scopo. Qualcosa del genere:
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 ;
Non credo che offra guadagni di velocità ma va bene per tutti gli altri motivi che citi:leggibilità, riutilizzabilità, facilità di manutenzione (immagina di trovare un errore dopo 2 anni e di dover modificare il codice tra (poche) centinaia luoghi).