我有这个查询,试图在插入已提交后更新另一个表中的几个值。在触发器内部有一个称为calc_distance
的函数,它返回一个DOUBLE类型的值。Mysql TRIGGER不更新功能返回值
所以,问题是,不管我是否正确调用函数,更新没有返回值。我测试了与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
,直到我致电更新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 ;
你确定问题出在这个函数上,而不是周围的查询?你更新一列(例如googlelat)然后在同一个语句里面读取它的值看起来很腥。 – RandomSeed
那么没有calc_distance调用的触发器运行平稳,并且工作正常......正在更新所有字段。现在calc_distance函数不起作用,odometro字段保持不变。当我说不工作时,我指的是更新没有从calc_distance函数返回结果,事实上,如果您添加odometro = odometro + googlelat + googlelong例如,它的工作原理是...函数calc_distance不起作用,但是,如果调用select calc_distance并提供所需的参数,则返回结果没有问题。 –
我的意思是:你确定函数正在接收参数'googlelat''abd'googlelong'的期望值吗?从你的函数中记录它们的值。 – RandomSeed