mySQL DELIMITER, выбрасывающий 1064 - PullRequest
3 голосов
/ 14 мая 2011
DELIMITER $$
DROP PROCEDURE IF EXISTS eventsNearMe$$

CREATE PROCEDURE eventsNearMe(IN inIP VARCHAR(16))
BEGIN

DECLARE ipLAT FLOAT;
DECLARE ipLONG FLOAT;

SELECT iplocationdb_location.latitude, iplocationdb_location.longitude
 INTO ipLAT, ipLONG
 FROM `iplocationdb_ip`
 LEFT JOIN iplocationdb_location ON iplocationdb_location.id=iplocationdb_ip.location_id
 WHERE iplocationdb_ip.prefix=(INET_ATON(inIP)>>24)
 AND INET_ATON(inIP) BETWEEN iplocationdb_ip.start_ip AND iplocationdb_ip.end_ip LIMIT 1;

CREATE TEMPORARY TABLE tempEVENTS
SELECT `eid`,(((acos(sin((ipLAT*pi()/180)) * sin((`lat`*pi()/180))+cos((ipLAT*pi()/180)) * cos((`lat`*pi()/180)) * cos(((ipLONG- `long`)*pi()/180))))*180/pi())*60*1.1515) as d FROM `mke_events` HAVING `d` <= 10 LIMIT 1;

SELECT * FROM tempEVENTS;

DROP TEMPORARY TABLE tempEVENTS;
END 
$$
DELIMITER ;  

Приведенный выше код должен, насколько я понимаю, быстро создать sp для получения событий рядом с заданным IP-адресом. Однако во время всех моих поисков я не нашел достаточной причины для того, чтобы он выбрасывал 1064 на РАЗДЕЛИТЕЛЬ (строка 1).
Даже если у меня ПРОСТО:

DELIMITER $$
SELECT * FROM iplocationdb_location;
$$
DELIMITER ;

По-прежнему запускается 1064. mySQL version 5.0.77.

ПРИМЕЧАНИЕ. У меня действительно есть пробел между разделителем и строкой-разделителем. ПРИМЕЧАНИЕ 2. Я использую heidiSQL для запуска этого скрипта, что, как я понимаю, равносильно запуску его из командной строки.

1 Ответ

1 голос
/ 24 октября 2012

Я также получал ложные синтаксические ошибки, связанные с DELIMITER, с командной строкой mysql, но не с HeidiSQL, из-за дополнительного пробела (символы табуляции) в строке DELIMITER.Например:

DELIMITER ;<TAB><TAB>

Устранение завершающего пробела исправило его (ваш комментарий о пробелах предупредил меня, спасибо.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...