2012-04-29 38 views
0

我第一次使用这些之一,我敢肯定,这工作,因为我已经拿起它在Stackoverflow,当我运行它作为一个SQL命令失败。这似乎是一个普遍的问题,已经尝试了几种不同的代码集我似乎得到了同样的问题....Stored程序1064错误我的SQL

MySQL表示:

1064 - 你在你的SQL语法错误;检查对应于你的MySQL服务器版本正确的语法使用手动

附近 '$$ CREATE FUNCTION GetDistance(coordinate1 VARCHAR(120), coordinate2 VARCHAR(' 在行1

DROP FUNCTION IF EXISTS `GetDistance`$$ 
CREATE FUNCTION `GetDistance`(coordinate1 VARCHAR(120), coordinate2 VARCHAR(120)) 
    RETURNS VARCHAR(120) 
BEGIN 
    DECLARE pos_comma1, pos_comma2 INT; 
    DECLARE lon1, lon2, lat1, lat2, distance DECIMAL(18,12); 
    select locate(',', coordinate1) into pos_comma1; 
    select locate(',', coordinate1, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate1, 1, pos_comma1-1) as DECIMAL(18,12)) into lon1; 
    select CAST(substring(coordinate1, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat1; 
    select locate(',', coordinate2) into pos_comma1; 
    select locate(',', coordinate2, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate2, 1, pos_comma1-1) as DECIMAL(18,12)) into lon2; 
    select CAST(substring(coordinate2, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat2; 
     select ((ACOS(SIN(lat1 * PI()/180) * SIN(lat2 * PI()/180) + COS(lat1 * PI()/180) * COS(lat2 * PI()/180) * COS((lon1 - lon2) * PI()/180)) * 180/PI()) * 60 * 1.1515) into distance; 
    RETURN distance; 
END$$ 

谢谢 - 人族

编辑

试图..........

DROP FUNCTION IF EXISTS `GetDistance`; 
delimiter $$ 
CREATE FUNCTION `GetDistance`(coordinate1 VARCHAR(120), coordinate2 VARCHAR(120)) 
    RETURNS VARCHAR(120) 
BEGIN 
    DECLARE pos_comma1, pos_comma2 INT; 
    DECLARE lon1, lon2, lat1, lat2, distance DECIMAL(18,12); 
    select locate(',', coordinate1) into pos_comma1; 
    select locate(',', coordinate1, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate1, 1, pos_comma1-1) as DECIMAL(18,12)) into lon1; 
    select CAST(substring(coordinate1, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat1; 
    select locate(',', coordinate2) into pos_comma1; 
    select locate(',', coordinate2, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate2, 1, pos_comma1-1) as DECIMAL(18,12)) into lon2; 
    select CAST(substring(coordinate2, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat2; 
     select ((ACOS(SIN(lat1 * PI()/180) * SIN(lat2 * PI()/180) + COS(lat1 * PI()/180) * COS(lat2 * PI()/180) * COS((lon1 - lon2) * PI()/180)) * 180/PI()) * 60 * 1.1515) into distance; 
    RETURN distance; 
END; 
$$ 

和..........

DROP FUNCTION IF EXISTS `GetDistance`; 
$$ 
CREATE FUNCTION `GetDistance`(coordinate1 VARCHAR(120), coordinate2 VARCHAR(120)) 
    RETURNS VARCHAR(120) 
BEGIN 
    DECLARE pos_comma1, pos_comma2 INT; 
    DECLARE lon1, lon2, lat1, lat2, distance DECIMAL(18,12); 
    select locate(',', coordinate1) into pos_comma1; 
    select locate(',', coordinate1, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate1, 1, pos_comma1-1) as DECIMAL(18,12)) into lon1; 
    select CAST(substring(coordinate1, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat1; 
    select locate(',', coordinate2) into pos_comma1; 
    select locate(',', coordinate2, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate2, 1, pos_comma1-1) as DECIMAL(18,12)) into lon2; 
    select CAST(substring(coordinate2, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat2; 
     select ((ACOS(SIN(lat1 * PI()/180) * SIN(lat2 * PI()/180) + COS(lat1 * PI()/180) * COS(lat2 * PI()/180) * COS((lon1 - lon2) * PI()/180)) * 180/PI()) * 60 * 1.1515) into distance; 
    RETURN distance; 
END; 
$$ 

都失败....

人族

编辑 - 发现这个工作脚本.... LINK: http://datamoil.blogspot.co.uk/2011/09/calculate-distance-between-two-points.html

CREATE FUNCTION distance_between (from_lat DECIMAL(6, 3), from_lng DECIMAL(6, 3), to_lat DECIMAL(6, 3), to_lng DECIMAL(6, 3)) RETURNS DECIMAL(11, 3) 
RETURN 6371 * 2 * ATAN2(SQRT(POW(SIN(RADIANS(to_lat - from_lat)/2), 2) + POW(SIN(RADIANS(to_lng - from_lng)/2), 2) * COS(RADIANS(from_lat)) * COS(RADIANS(to_lat))), SQRT(1 - POW(SIN(RADIANS(to_lat - from_lat)/2), 2) + POW(SIN(RADIANS(to_lng - from_lng)/2), 2) * COS(RADIANS(from_lat)) * COS(RADIANS(to_lat)))); 

回答

1
DROP FUNCTION IF EXISTS `GetDistance`; 

delimiter $$ 
CREATE FUNCTION `GetDistance`... 
    ... 
    RETURN distance; 
END; 
$$ 
+0

如上 - 试着与没有运气:( – 2012-04-29 13:54:37

+0

@TerranBrown:我复制了第一个功能 – 2012-04-29 13:56:25

+0

我不知道是否它的一些东西在我的主机上停止,然后重试并得到“MySQL说: #1064 - 你的SQL语法错误;检查手册对应于您的MySQL服务器版本,以便在'delimiter $$附近使用正确的语法CREATE FUNCTION'GetDistance'(coordinate1 VARCHAR(120),坐标'在第1行“ – 2012-04-29 13:59:35

0

在执行此代码之前,您必须将您的分隔符更改为$$。

这对我的作品(MySql上测试)

DROP FUNCTION IF EXISTS `GetDistance`; 
delimiter $$ 
CREATE FUNCTION `GetDistance`(coordinate1 VARCHAR(120), coordinate2 VARCHAR(120)) 
    RETURNS VARCHAR(120) 
BEGIN 
    DECLARE pos_comma1, pos_comma2 INT; 
    DECLARE lon1, lon2, lat1, lat2, distance DECIMAL(18,12); 
    select locate(',', coordinate1) into pos_comma1; 
    select locate(',', coordinate1, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate1, 1, pos_comma1-1) as DECIMAL(18,12)) into lon1; 
    select CAST(substring(coordinate1, pos_comma1+1, pos_comma2-pos_comma1-1) as  DECIMAL(18,12)) into lat1; 
    select locate(',', coordinate2) into pos_comma1; 
    select locate(',', coordinate2, pos_comma1+1) into pos_comma2; 
    select CAST(substring(coordinate2, 1, pos_comma1-1) as DECIMAL(18,12)) into lon2; 
    select CAST(substring(coordinate2, pos_comma1+1, pos_comma2-pos_comma1-1) as DECIMAL(18,12)) into lat2; 
    select ((ACOS(SIN(lat1 * PI()/180) * SIN(lat2 * PI()/180) + COS(lat1 * PI()/180) * COS(lat2 * PI()/180) * COS((lon1 - lon2) * PI()/180)) * 180/PI()) * 60 * 1.1515) into distance; 
    RETURN distance; 
END; 
$$ 
+0

如上 - 试着与没有运气:( – 2012-04-29 13:54:09