2013-09-25 71 views
0

我有这个查询,试图在插入已提交后更新另一个表中的几个值。在触发器内部有一个称为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 ; 

我宣布LAT1LAT2LNG1LNG2DISTANCE设置与NEW.latitude所有这些变量等等,但我意识到,我不能做这些变量任何东西,因为我无法访问NEW.latitude和值googlelatgooglelong,直到我致电更新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 ; 
+0

你确定问题出在这个函数上,而不是周围的查询?你更新一列(例如googlelat)然后在同一个语句里面读取它的值看起来很腥。 – RandomSeed

+0

那么没有calc_distance调用的触发器运行平稳,并且工作正常......正在更新所有字段。现在calc_distance函数不起作用,odometro字段保持不变。当我说不工作时,我指的是更新没有从calc_distance函数返回结果,事实上,如果您添加odometro = odometro + googlelat + googlelong例如,它的工作原理是...函数calc_distance不起作用,但是,如果调用select calc_distance并提供所需的参数,则返回结果没有问题。 –

+0

我的意思是:你确定函数正在接收参数'googlelat''abd'googlelong'的期望值吗?从你的函数中记录它们的值。 – RandomSeed

回答

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; 

FYI:现在是一个语句触发,这样你就不需要更改DELIMITER和使用BEGIN...END块。

+0

Nop,不更新字段odometro。仍然是一样的。抱歉。 –

+0

请参阅更新并检查功能是否有问题。 –

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 ;