MySQL stored function malfunction, but working as a standalone query

I have a basic query with some calculations for the distance between two coordinates on the basis of this discussion . It seems to work just fine as a standalone query, but when I try to run it as a stored function, it returns strange results (usually null or 99.9999 ...).

Standalone request:

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 is normal. Then I tried changing it to a saved 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 doing it as follows:

select distance_meters(32.113277, 34.799259, 32.113391, 34.801571)

led to 99.999999

I even tried to put all the input values ​​(for coordinates) as part of the stored function code, for example:

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 that did not change the problem result at all!

PS: , , , . .

EDIT: , :

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()

?

+4
1

, . ​​, lat1 lat2.

return (6371000 * acos (cos ( (lat1)) * cos ( (lat2) )) * cos ( (lng2) - (lng1)) + sin ( (lat1)) * sin ( (lat2))));

- . , , DECIMAL (18,6), , , .

+1

Source: https://habr.com/ru/post/1666734/


All Articles