2014-10-06 51 views
0

我试图在MySQL 5.5.38中编写我第一个存储的函数,但是我无法通过令人讨厌的语法错误。我已经检查过MySQL文档,但是我仍然看不到问题所在,并且错误消息仅显示You have an error in your SQL syntax; blah blah blah ... at line 1创建存储函数时出现语法错误

下面的代码:

DELIMITER $$ 

CREATE FUNCTION distm (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) 
    RETURNS DOUBLE NO SQL DETERMINISTIC 
BEGIN 
    DECLARE radius DOUBLE; 
    SET radius = 6371008.771415059; 

    DECLARE x1, y1, x2, y2, dlat, dlng DOUBLE; 
    SET x1 = RADIANS(lng1); 
    SET y1 = RADIANS(lat1); 
    SET x2 = RADIANS(lng2); 
    SET y2 = RADIANS(lat2); 
    SET dlng = x2 - x1; 
    SET dlat = y2 - y1; 

    DECLARE dist DOUBLE; 
    SET dist = 2 * radius * ASIN(
     SQRT(
      POW(SIN(dlat/2), 2) 
      + COS(y1) * COS(y2) * POW(SIN(dlng/2), 2) 
     ) 
    ); 
    RETURN dist; 
END$$ 

DELIMITER ; 

编辑:确切的错误信息是:

SQL Error [1064] [42000]: 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 'DELIMITER $$ 

CREATE FUNCTION distm (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2' at line 1 
+0

你尝试IF EXISTS distm删除'DROP功能之后;'? – 2014-10-06 17:05:32

+0

它绝对不会说'等等等等等等..如果你想得到进一步的帮助,发布确切的错误。 – Rahul 2014-10-06 17:06:08

+0

@Rahul你说得对,我已经添加了确切的错误信息。 – 2014-10-06 17:25:37

回答

0

尝试DELIMITER $$之前去除DROP语句,并再次运行。

此外,将行RETURNS DOUBLE NO SQL DETERMINISTIC更改为以下。请注意,这不是NO SQL DETERMINISTICNOT DETERMINISTIC

RETURNS DOUBLE NOT DETERMINISTIC 
+0

我从我的帖子中的代码中删除了上述语句。但是文档明确说它是'NO SQL':https://dev.mysql.com/doc/refman/5.1/en/create-procedure.html – 2014-10-06 17:25:18

+0

再次正确地检查文档。 – Rahul 2014-10-06 17:30:51

+0

@ 3k-从您链接到的文档:“**无SQL **表示该例程不包含SQL语句。”虽然这只是建议性的,但我认为你的SP *包含SQL语句,因此你不应该使用这个特性。 – 2014-10-06 17:44:32

相关问题