Может кто-нибудь помочь мне с хранимой процедурой MySQL

0

Я никогда раньше не делал этого и пытаюсь работать через онлайн-руководство, но я не могу найти хороший пример с параметрами.

CREATE PROCEDURE `calcdistance` (
    IN ulat varchar, 
    IN ulon varchar, 
    IN clat varchar, 
    IN clon varchar)
BEGIN
Select DEGREES(ACOS(SIN(RADIANS(ulat))
    * SIN(RADIANS(clat))
    + COS(RADIANS(ulat))
    * COS(RADIANS(clat))
    * COS(RADIANS(ulon - ulon))))) * 69.09 AS distance
END

ошибка, которую администратор MySQL дает мне, когда я пытаюсь это сделать:

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 '  IN ulat varchar, 
    IN ulon varchar, 
    IN clat varchar, 
    IN cl' at line 2 (error 1064)
  • 1
    в чем именно проблема?: В любом случае, вы не «возвращаете» результат. Вы можете сделать: SELECT DEGREES(ACOS(SIN(RADIANS(ulat)) * SIN(RADIANS(clat)) + COS(RADIANS(ulat)) * COS(RADIANS(clat)) * COS(RADIANS(ulon - ulon))))) * 69.09 AS distance
  • 0
    Я только что опубликовал ошибку, которую получаю при попытке
Теги:
stored-procedures

3 ответа

2

вы можете попробовать

DELIMITER $$
DROP PROCEDURE IF EXISTS calcdistance$$
CREATE PROCEDURE `calcdistance` (IN ulat VARCHAR(50), IN ulon VARCHAR(50), IN clat VARCHAR(50), IN clon VARCHAR(50))
    BEGIN
    SELECT 
    DEGREES(ACOS(SIN(RADIANS(ulat)) 
    * SIN(RADIANS(clat))
    + COS(RADIANS(ulat))
    * COS(RADIANS(clat))
    * COS(RADIANS(ulon - ulon))))
    * 69.09 AS distance;


     END$$

DELIMITER ;
  • 0
    это все еще дает мне ошибки. У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'DELIMITER $$ DROP PROCEDURE IF EXISTS calcdistance $$ CREATE PROCEDURE `calcdista' в строке 1 (ошибка 1064)
  • 0
    Я предполагаю, что вы используете PhpMyAdmin, и, следовательно, выдает ошибку, попробуйте использовать командную строку или sqlYog. Это работает нормально для меня в sqlYog
Показать ещё 7 комментариев
0

В вашем запросе varchar должен быть varchar (255). И я думаю, что хранимая процедура должна закончиться; по умолчанию, если вы не используете DELIMITER.

-2

Расстояние большого круга

Найдите расстояние в километрах между двумя точек на поверхности земли. Это просто проблема хранимые функции. Для приближения первого порядка, игнорировать отклонения земной поверхности от совершенно сферической. Тогда расстояние в радианах дается рядом тригонометрических формулы. ACOS и COS ведут себя разумно:

             COS(lat1-lat2)*(1+COS(lon1-lon2)) - COS(lat1+lat2)*(1-COS(lon1-lon2)) 
rads = ACOS( --------------------------------------------------------------------- ) 
                                              2

Нам нужно преобразовать градусы широты и долготы в радианы, и мы необходимо знать длину в км одного радиана на поверхности земли, что составляет 6378,388. Функция:

set log_bin_trust_function_creators=TRUE; 

DROP FUNCTION IF EXISTS GeoDistKM; 
DELIMITER | 
CREATE FUNCTION GeoDistKM( lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) RETURNS float 
BEGIN 
  DECLARE pi, q1, q2, q3 FLOAT; 
  DECLARE rads FLOAT DEFAULT 0; 
  SET pi = PI(); 
  SET lat1 = lat1 * pi / 180; 
  SET lon1 = lon1 * pi / 180; 
  SET lat2 = lat2 * pi / 180; 
  SET lon2 = lon2 * pi / 180; 
  SET q1 = COS(lon1-lon2); 
  SET q2 = COS(lat1-lat2); 
  SET q3 = COS(lat1+lat2); 
  SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );  
  RETURN 6378.388 * rads; 
END; 
| 
DELIMITER ; 

-- toronto to montreal (505km): 
select geodistkm(43.6667,-79.4167,45.5000,-73.5833); 
+----------------------------------------------+ 
| geodistkm(43.6667,-79.4167,45.5000,-73.5833) | 
+----------------------------------------------+ 
|                           505.38836669921875 | 
+----------------------------------------------+ 

(Настройка log_bin_trust_function_creators является наиболее удобным способом которые применяются с 5.0.6.)

Источник

  • 1
    Обычно ответы, содержащие только одну стороннюю ссылку, здесь не одобряются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню