错误1366的MySQL退出处理程序未触发

时间:2015-12-09 17:52:41

标签: mysql error-handling

使用:MySQL 5.6.15

我遇到一个退出处理程序没有触发MySQL函数的问题。我不确定它是否与此处讨论的问题有关:MySQL exit handler ignored

我有以下代码,它需要2个LAT / LON对并找到这些点之间的距离。我想要捕获任何不是小数的东西(错误1366)并简单地传回一个空白字符串。

CREATE DEFINER=`myself`@`%` FUNCTION `DIST_BETWEEN_COORDS`(`lat1` DECIMAL(10,6), `lon1` DECIMAL(10,6), `lat2` DECIMAL(10,6), `lon2` DECIMAL(10,6))
RETURNS varchar(50) CHARSET utf8 COLLATE utf8_unicode_ci
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Find the distance between 2 sets of coordinates'
BEGIN

DECLARE op VARCHAR(50);

DECLARE EXIT HANDLER FOR 1366
    BEGIN 
        RETURN '';
    END;

    SET @R := 6371; #Radius of the earth in km
    SET @dLat := RADIANS(lat2-lat1);
    SET @dLon := RADIANS(lon2-lon1);
    SET @a := SIN(@dLat/2) * SIN(@dLat/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(@dLon/2) * SIN(@dLon/2);
    SET @c := 2 * ATAN2(SQRT(@a), SQRT(1-@a));
    SET @d := (@R * @c) * 1000; #Distance in meters
    SET @df := @d * 3.28084; #Distance in feet
            IF @df >= 1320 THEN
        SET @dm := @df/5280; #Distance in miles
        SET op = CONCAT(ROUND(@dm,2), " miles");
    ELSE
        SET op = CONCAT(ROUND(@df,2), " feet");
    END IF;

    RETURN op;

END

函数本身效果很好,但EXIT处理程序永远不会触发,即使我向其中一个坐标的函数发送空白或文本字符串。

1 个答案:

答案 0 :(得分:0)

未触发退出处理程序,因为未引发错误。如果您尝试在整数列中插入非整数值,则会触发处理程序。

此外,参数为DECIMAL(10,6)。在调用函数之前会引发任何错误。

您可以将参数作为VARCHAR或CHAR传递,并在需要时自行验证。