挿入がコミットされた後、別のテーブルのいくつかの値を更新しようとするこのクエリがあります。トリガー内には、 DOUBLE型の値calc_distance
を返す関数が呼び出されます。
したがって、問題は、関数を適切に呼び出しても、更新が戻り値を取得しないことです。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
を宣言して、これらすべての変数を NEW.latitude などで設定しましたが、 NEW.latitude と値にアクセスできないか、update を呼び出すまでDISTANCE
、これらの変数を使用して何もできないことに気付きました。行く?私は次のように機能をテストしました: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 ;