Я создал функцию MySQL, чтобы определить, находится ли набор координат широты и долготы в определенном диапазоне другого набора координат широты и долготы. Однако функция выдает синтаксическую ошибку, поэтому я не могу проверить, работает ли она правильно. Любая помощь в выяснении того, что является причиной ошибки, будет принята с благодарностью. Функция вместе с описанием написана ниже:
Работает, передавая начальные координаты широты и долготы функции. База данных содержит строки targa, targb и targc, которые содержат широту, долготу и диапазон (соответственно) для сравнения. Столбец targ в базе данных указывает, следует ли проверять эту строку на широту / долготу.
CREATE FUNCTION inrange(
lat1 decimal(11, 7),
lon1 decimal(11, 7))
READS SQL DATA
RETURNS INT(1)
BEGIN
DECLARE distance decimal(18, 10);
SET distance = ACOS(SIN(lat1)*SIN(targ2)+COS(lat1)*COS(targ2)*COS(targ3-lon1))*6371;
IF distance <= targ4 THEN
RETURN 1;
END IF;
RETURN 0;
END$$
Ошибка, которую дает мне mysql:
1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с READS SQL DATA
ВОЗВРАЩАЕТ INT (1)
НАЧАТЬ
ОБЪЯВИТЬ десятичное расстояние (18, 10) 'в строке 4
Я не могу понять, как обойти эту ошибку.
Кроме того, если кто-то пришел к этому сообщению в поисках такой функции mysql, у меня также был другой связанный пост:
Функция MySQL для определения близости / диапазона почтового индекса
Я очень благодарен другому постеру за его функции (который послужил источником вдохновения для этого), но мне нужно что-то более компактное. Следовательно, рассматриваемая функция.
РЕДАКТИРОВАТЬ: Следующий код работает и работает. Просто не забудьте установить разделитель на $$. Еще раз спасибо всем за помощь.
Рабочий код:
CREATE FUNCTION inrange(
lat1 decimal(11, 7),
long1 decimal(11, 7),
lat2 decimal(11, 7),
long2 decimal(11, 7),
rng decimal(18, 10))
RETURNS INT(1)
BEGIN
DECLARE distance decimal(18, 10);
SET lat1 = lat1 * PI() / 180.0,
long1 = long1 * PI() / 180.0,
lat2 = lat2 * PI() / 180.0,
long2 = long2 * PI() / 180.0;
SET distance = ACOS(SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(long2-long1))*6371;
IF distance <= rng THEN
RETURN 1;
END IF;
RETURN 0;
END$$