mySQL DELIMITER投掷1064

时间:2011-05-14 03:00:19

标签: mysql stored-procedures

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地址附近的事件。然而,通过我所有的搜索,我没有找到一个令人满意的理由,它在DELIMITER(第1行)上扔了1064。 即使我有JUST:

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

仍然会激活1064. mySQL版本5.0.77。

注意:我在DELIMITER和分隔字符串之间有空格。 注意2:我正在使用heidiSQL来运行这个脚本,这应该等于我的理解从命令行运行它。

1 个答案:

答案 0 :(得分:1)

由于DELIMITER行上有额外的尾随空格(制表符),我还得到了与命令行mysql有关的虚假DELIMITER相关语法错误,但没有使用HeidiSQL。例如:

DELIMITER ;<TAB><TAB>

删除固定的空格(你对空白的评论让我失望了,谢谢。)