I have a basic query with some calculations for distance between two coordinates, based on this discussion. It seems to run fine as standalone query, but when I try to run it as a stored function, it returns weird results (usually null or 99.9999...).
The standalone query is:
SELECT lat, lng,
( 6371 * acos( cos( radians(32.113277) ) * cos( radians( lat ) )
* cos( radians(lng) - radians(34.799259)) + sin(radians(32.113277))
* sin( radians(lat)))) AS distance_km,
( 6371000 * acos( cos( radians(32.113277) ) * cos( radians( lat ) )
* cos( radians(lng) - radians(34.799259)) + sin(radians(32.113277))
* sin( radians(lat)))) AS distance_meters
FROM (
SELECT 32.113391 as lat , 34.801571 as lng
) a
^ This runs fine. Then I tried to change it into a stored function:
create function distance_meters(lat1 decimal(8,6), lng1 decimal(8,6), lat2 decimal(8,6), lng2 decimal(8,6) )
returns decimal(8,6) DETERMINISTIC
return ( 6371000 * acos( cos( radians(lat1) ) * cos( radians( lat2 ) )
* cos( radians(lng2) - radians(lng1)) + sin(radians(lat2))
* sin( radians(lat2))))
and executing it like this:
select distance_meters(32.113277, 34.799259, 32.113391, 34.801571)
resulted in 99.999999
I even tried to put all the input values (for the coordinates) as part of the stored function's code, like this:
create function distance_meters()
returns decimal(8,6) DETERMINISTIC
return ( 6371000 * acos( cos( radians(32.113277) ) * cos( radians( 32.113391 ) )
* cos( radians(34.801571) - radians(34.799259)) + sin(radians(32.113277))
* sin( radians(32.113391))));
but it didn't change the problematic result at all!
PS: of course I dropped the function every time before re-creating it. Also tried to change the return type from decimal to numeric.
EDIT: as suggested in the comments, I've also tried this:
DELIMITER $
create function distance_meters()
returns decimal(8,6) DETERMINISTIC
begin
declare var_name decimal(8,6);
set var_name = ( 6371000 * acos( cos( radians(32.113277) ) * cos( radians( 32.113391 ) )
* cos( radians(34.801571) - radians(34.799259)) + sin(radians(32.113277))
* sin( radians(32.113391))));
return var_name;
end$
DELIMITER ;
select distance_meters()
What am I missing here?