MySQL 存储函数出现故障,但作为独立查询工作

标签 mysql stored-procedures coordinates gis stored-functions

我有一个基本查询,根据 this discussion 计算两个坐标之间的距离. 它作为独立查询似乎运行良好,但当我尝试将其作为存储函数运行时,它返回奇怪的结果(通常为 null 或 99.9999...)。

独立查询是:

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

^ 这运行良好。然后我尝试将其更改为存储函数:

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

然后像这样执行:

select distance_meters(32.113277, 34.799259, 32.113391, 34.801571)

结果为 99.999999

我什至尝试将所有输入值(用于坐标)作为存储函数代码的一部分,如下所示:

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

但它根本没有改变有问题的结果!

PS:当然,我每次都在重新创建之前删除了该功能。还尝试将返回类型从十进制更改为数字。

编辑:正如评论中所建议的,我也试过这个:

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

我在这里错过了什么?

最佳答案

解决方案似乎有两个部分。一部分是函数中的错字,其中 lat1 和 lat2 被调换了。

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

另一点是足够提高小数列的精度。我没有测试所需的最低精度,但当我尝试使用 DECIMAL(18,6) 时,它似乎有效。

关于MySQL 存储函数出现故障,但作为独立查询工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639187/

相关文章:

java - 在不应该的时候返回零

delphi - 如何将工作区坐标转换为屏幕坐标?

php - 使用谷歌地图坐标寻找最近邻算法

mysql - MySQL 中的 UNION 和 ORDER BY 问题

php - 无法将记录从一个表更新到另一个表

sql-server - 从 SQL Native 存储过程 (Hekaton) 中的表进行更新

sql-server - 通过减少生成的唯一查询计划来优化动态 SQL 存储过程

jquery - 当 ajax 请求被中止时,我如何关闭 mysql 连接?

mysql - 选择聚合函数和所有其他列

php - 存储过程 php pdo 与 mariadb - 做错事