【问题标题】:MySQL Exit Handler for Error 1366 Not Firing未触发错误 1366 的 MySQL 退出处理程序
【发布时间】:2015-12-09 17:52:41
【问题描述】:

使用: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 处理程序永远不会触发,即使我将空白或文本字符串发送到函数以获取其中一个坐标。

【问题讨论】:

    标签: mysql error-handling


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我使用非数字值运行函数时,我得到:/* SQL 错误(1366):十进制值不正确:'' for column 'lon2' at row 1 */
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2021-09-16
    • 2015-02-02
    • 1970-01-01
    • 2015-07-07
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多