0

挿入がコミットされた後、別のテーブルのいくつかの値を更新しようとするこのクエリがあります。トリガー内には、 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、これらの変数を使用して何もできないことに気付きました。行く?私は次のように機能をテストしました:googlelatgooglelongtableXcalc_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 ;
4

2 に答える 2

1

正しく理解できたら試してみてください

CREATE TRIGGER `DB1`.`update_coords`
AFTER INSERT ON `DB1`.`TABLE_tracking`
FOR EACH ROW
    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',
           odometro = odometro + 
                      calc_distance(IF(NEW.latitude <> 0, NEW.latitude, googlelat),
                                    NEW.latitude,
                                    IF(NEW.longitude <> 0, NEW.longitude, googlelong),
                                    NEW.lontitude)
     WHERE imei = NEW.device_id;

参考までに: これは 1 ステートメントのトリガーになったため、ブロックを変更DELIMITERして使用する必要はありません。BEGIN...END

于 2013-09-25T06:05:21.760 に答える
0

これが最善の解決策です。別のテーブルから更新しようとするのではなく、影響を受けるテーブルから直接更新してみませんか?

    DELIMITER ;;
    CREATE TRIGGER `DB1`.`update_distances`
    BEFORE UPDATE ON `DB1`.`tb_vehiculos`
    FOR EACH ROW
    BEGIN
    SET @DISTANCE = calc_distance(OLD.googlelat,NEW.googlelat,OLD.googlelong,NEW.googlelong);
    SET NEW.odometro = OLD.odometro + @DISTANCE;
    END ;;
    DELIMITER ;
于 2013-09-26T06:54:26.733 に答える