MYSQL - 表未从过程更新

Posted

技术标签:

【中文标题】MYSQL - 表未从过程更新【英文标题】:MYSQL - table not updating from Procedure 【发布时间】:2018-11-05 02:02:17 【问题描述】:

我想获取两个 GeoPoints 之间的距离(使用 LatLong),因为我从提供的解决方案中编写了 GETDISTANCE 函数 [mysql Function to calculate distance between two latitudes and longitudes.如果我独立调用函数,它就像魅力一样。 据我了解,我无法从 MySQL 中的函数返回 ResultSet,所以我创建了过程并在过程中调用函数,如下所示:

  DELIMITER $$
     CREATE PROCEDURE GetNearByGeoPoints(IN Lat REAL, IN Longi REAL)
       BEGIN
       DECLARE v_max int;
       DECLARE v_counter int unsigned default 0;


       SET @v_max = (SELECT COUNT(*) FROM TransmitterPointsData);

       START TRANSACTION;

       WHILE v_counter < v_max
       DO

       SELECT @coverageID :=CoverageID, @tableLatitude := Latitude, @tableLongitude :=Longitude FROM TransmitterPointsData LIMIT v_counter,1;

       SET @Dist= GETDISTANCE(Lat, Longi, tableLatitude, tableLongitude);

       UPDATE TransmitterPointsData SET DynamicDistance = @Dist WHERE CoverageID= @coverageID;

       set v_counter=v_counter+1;

       END WHILE;
       COMMIT;

       SELECT * FROM TransmitterPointsData;
       END $$
     DELIMITER ;

我要做的是从用户那里获取一组 LatLong 参数,并将其与表中的每组 LatLong 进行比较。从函数获取输出后,我正在使用 coverageID 上的 where 条件更新 TransmitterPointsData 表。

这是我迄今为止的第一个 MySQL 查询,我遵循语法,但我不知道为什么我会在 DynammicDistance 列中获取所有 null 值。

提前致谢

【问题讨论】:

不应该是GETDISTANCE(Lat, Longi, @tableLatitude, @tableLongitude)吗?我很惊讶该程序编译... 我也这样做了,但最后还是给了我空值 此时我最好的猜测是您对 GETDISTANCE 的输入值的计算是错误的。尝试添加一些调试信息(存储/打印与结果一起计算的输入)。 我尝试通过提供硬编码值从存储过程中调用 GETDISTANCE(10, 12, 12, 12) 之类的函数,但在 DynammicDistance 列中仍然为空。但是如果我独立调用函数 GETDISTANCE(10, 12, 12, 12) 我得到 138.11138916015625 作为输出。根据 mysql 查询,它应该更新 DynamicDistance 列中的 138.111*** 值 【参考方案1】:

尝试用这个替换while循环:

UPDATE TransmitterPointsData
SET DynamicDistance = GETDISTANCE(Lat, Longi, Latitude, Longitude)

短得多,并且您可以通过限制 + 偏移避免潜在的行选择问题(这充其量是一种糟糕的风格,并且每次都会给您一个随机的行,更糟糕的是)。

【讨论】:

以上是关于MYSQL - 表未从过程更新的主要内容,如果未能解决你的问题,请参考以下文章

Hive 外部表未从 CSV 源读取整个字符串

s-s-rS 报告未从存储过程中提取数据

Android 应用程序未从快捷方式启动

表未在单选查询中更新

Debezium 心跳表未更新

刷新网站时样式表未更新