我有这个查询,它尝试在提交插入后更新另一个表中的几个值。在触发器内部有一个被调用的函数calc_distance
,它返回一个DOUBLE类型的值。
因此,问题在于,无论我是否正确调用该函数,更新都不会采用返回值。我测试了与 mysql 命令提示符分开运行它的函数,实际上它返回了预期的计算。
那么有人可以告诉我这个查询发生了什么吗?
DELIMITER ;;
TRIGGER `DB1`.`update_coords`
AFTER INSERT ON `DB1`.`TABLE_tracking`
FOR EACH ROW
BEGIN
DECLARE LAT1, LAT2, LNG1, LNG2, DISTANCE DOUBLE;
UPDATE TABLE_vehiculos SET ultima_comunicacion = now(),
googlelat=(IF(NEW.latitude<>0,NEW.latitude,googlelat)), googlelong=(IF(NEW.longitude<>0,NEW.longitude,googlelong)),
tipo_data=NEW.command, reported_command=(IF(NEW.valid=1,"F","A")), velocidad=NEW.speed, status="A",
/* HERE COMES THE FUNCTION THAT IS NOT DOING ANYTHING */
odometro=odometro+calc_distance(googlelat,NEW.latitude,googlelong,NEW.lontitude)
/* --------------------------------------------------- */
WHERE imei = NEW.device_id;
END ;;
DELIMITER ;
我声明LAT1
, LAT2
, LNG1
, LNG2
,DISTANCE
用 NEW.latitude 等设置所有这些变量,但我意识到我无法对这些变量做任何事情,因为我无法访问 NEW.latitude 和值googlelat
,或者googlelong
直到我调用 update tableX
,所以,什么是继续?我测试了calc_distance
这样的功能:
mysql> select calc_distance(9.104550000000, 9.102577000000, -79.370780000000, -79.3622423000000);
+------------------------------------------------------------------------------------+
| calc_distance(9.104550000000, 9.102577000000, -79.370780000000, -79.3622423000000) |
+------------------------------------------------------------------------------------+
| 0.9627214584265752 |
+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
在过去的 6 个小时里,我一直在用头撞显示器,请帮忙!!
DELIMITER ;;
CREATE FUNCTION `calc_distance`(`lat1` DOUBLE, lat2 DOUBLE, lng1 DOUBLE, lng2 DOUBLE)
RETURNS DOUBLE
BEGIN
DECLARE radio INTEGER(5);
DECLARE distance DOUBLE;
set radio = 6371;
SELECT radio * 2 * ASIN
( SQRT (POWER(SIN((lat1 - lat2)*pi()/180 / 2),2) +
COS(lat1 * pi()/180) * COS(lat2 *pi()/180) *
POWER(SIN((lng1 - lng2) *pi()/180 / 2), 2) ) ) into distance;
RETURN distance;
END ;;
DELIMITER ;