MySQL函数抛出语法错误

时间:2017-04-25 14:07:41

标签: mysql function

我有一个查询,用于计算给定lat和lng以及POINT s的距离。

现在我想让它成为一个功能:

DELIMITER $$

CREATE FUNCTION CalculateDistance(geobreite double, geolaenge double, umkreis int) RETURNS INT READS SQL DATA

BEGIN

SET @ibk_laenge = geobreite;
SET @ibk_breite = geolaenge;
SET @umkreis = umkreis;
SET @breite_nord = @ibk_breite + (@umkreis / 111);
SET @breite_sued = @ibk_breite - (@umkreis / 111);
SET @laenge_west = @ibk_laenge - (@umkreis / ABS(COS(RADIANS(@ibk_breite))) * 111);
SET @laenge_ost = @ibk_laenge + (@umkreis / ABS(COS(RADIANS(@ibk_breite))) * 111);

SET @mp = CONCAT('MULTIPOINT(', @breite_sued , ' ', @laenge_west, ', ', @breite_nord, ' ', @laenge_ost, ')');

SET @quadrat = ENVELOPE(GEOMFROMTEXT(@mp));

RETURN 
    SELECT (
        FLOOR(
            SQRT(
                POW((@ibk_breite - sub.breite) * 111, 2) + 
                POW((@ibk_laenge - sub.laenge) * 111 * ABS(COS(RADIANS(@ibk_breite))),2)
            )
        )

    ) AS distanz

    FROM
        (
            SELECT Y(location) AS laenge, X(location) AS breite FROM meetings WHERE MBRCONTAINS(@quadrat, location)
        ) 
    AS sub;

END; $$ 

DELIMITER ;

但它引发了一个错误:

  

1064 - 您的SQL语法出错;检查>对应于您的MySQL服务器版本的手册,以获得正确的语法,以便在附近使用   '选择(
             FLOOR(
                 SQRT(
                    战俘((@ i'在第18行

如果我用phpmyadmin执行查询,它可以正常运行。

1 个答案:

答案 0 :(得分:1)

要修复语法错误,请尝试将SELECT查询包装到括号中,例如 -

RETURN (SELECT column1 FROM table WHERE id = 1);

下一个问题:函数必须返回一个标量值,如果SELECT查询返回一些记录,则会出错。

此外,您可以使用SELECT ... INTO查询将值写入变量,并在返回之后:

SELECT FLOOR(SQRT(...)) INTO @ret FROM ...;
RETURN @ret;