2011-05-14 77 views
3
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個。
即使我剛纔:mySQL DELIMITER投擲1064

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

它仍然火災1064 MySQL版本5.0.77。

注意:我在DELIMITER和分隔字符串之間有空格。 注意2:我使用heidiSQL來運行這個腳本,根據我的理解,這應該等同於從命令行運行它。

+0

我認爲最後一行應該是'DELIMITER; $$' – Vijay 2011-05-14 05:18:57

+0

更新:我將sql文件傳遞給其他人,並且他創建了SP。奇怪的權利? – meteorainer 2011-05-14 19:47:20

+0

另一個更新:顯然有權限的問題。不知道它爲什麼會出現語法錯誤,但現在看起來很好。 – meteorainer 2011-05-14 20:39:16

回答

1

由於DELIMITER行上多餘的尾隨空格(製表符),我還得到了與命令行mysql相關的錯誤的與DELIMITER相關的語法錯誤,但與HeidiSQL無關。例如:

DELIMITER ;<TAB><TAB> 

刪除尾部的空格固定它(你對空白評論放倒我了,謝謝。)