2017-04-25 12 views
0

私は与えられたlatとlngとの距離を計算するクエリとPOINTを持っています。MySQL関数が構文エラーをスローする

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 - You have an error in your SQL syntax; check the manual that >corresponds to your MySQL server version for the right syntax to use near
'SELECT (
FLOOR(
SQRT(
POW((@i' at line 18

私はphpMyAdminのでクエリを実行した場合、それは何の問題もなく動作します。

+0

は再びエラーメッセージが表示されていorcurr? – reporter

答えて

1

構文エラーを修正するには、SELECTクエリを大括弧に囲みます。 -

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

次の問題:関数は1つのスカラー値を返す必要があります。SELECTクエリがいくつかのレコードを返す場合、エラーが発生します。

また、あなたは変数に値を書き込むために、クエリSELECT ... INTOを使用することができ、そしてそれを返した後:あなたは例の値の代わりに、変数を使用する場合

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