任何人都可以帮助我使用MySQL存储过程

时间:2010-09-18 15:17:57

标签: mysql stored-procedures

我之前从未做过一次尝试通过在线指南,但我似乎无法找到一个带参数的好例子。

CREATE PROCEDURE `calcdistance` (
    IN ulat varchar, 
    IN ulon varchar, 
    IN clat varchar, 
    IN clon varchar)
BEGIN
Select DEGREES(ACOS(SIN(RADIANS(ulat))
    * SIN(RADIANS(clat))
    + COS(RADIANS(ulat))
    * COS(RADIANS(clat))
    * COS(RADIANS(ulon - ulon))))) * 69.09 AS distance
END

MySQL管理员在尝试此操作时给出的错误是:

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 '  IN ulat varchar, 
    IN ulon varchar, 
    IN clat varchar, 
    IN cl' at line 2 (error 1064)

3 个答案:

答案 0 :(得分:2)

你可以尝试

DELIMITER $$
DROP PROCEDURE IF EXISTS calcdistance$$
CREATE PROCEDURE `calcdistance` (IN ulat VARCHAR(50), IN ulon VARCHAR(50), IN clat VARCHAR(50), IN clon VARCHAR(50))
    BEGIN
    SELECT 
    DEGREES(ACOS(SIN(RADIANS(ulat)) 
    * SIN(RADIANS(clat))
    + COS(RADIANS(ulat))
    * COS(RADIANS(clat))
    * COS(RADIANS(ulon - ulon))))
    * 69.09 AS distance;


     END$$

DELIMITER ;

答案 1 :(得分:0)

在您的查询中,varchar应为varchar(255)。我认为存储过程应该以;默认情况下,除非您使用DELIMITER。

答案 2 :(得分:-1)

  

大圆距离

     

找出两者之间的距离   在地球表面上的点。这只是一种问题   存储的功能是为了。对于一阶近似,   忽略地球表面与完美球形的偏差。   那么以弧度表示的距离由一些三角函数给出   公式。 ACOS和COS表现得相当合理:

             COS(lat1-lat2)*(1+COS(lon1-lon2)) - COS(lat1+lat2)*(1-COS(lon1-lon2)) 
rads = ACOS( --------------------------------------------------------------------- ) 
                                              2
  

我们需要将纬度和经度转换为弧度,我们需要   需要知道地球表面上一个弧度的长度,   这是6378.388。功能:

set log_bin_trust_function_creators=TRUE; 

DROP FUNCTION IF EXISTS GeoDistKM; 
DELIMITER | 
CREATE FUNCTION GeoDistKM( lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) RETURNS float 
BEGIN 
  DECLARE pi, q1, q2, q3 FLOAT; 
  DECLARE rads FLOAT DEFAULT 0; 
  SET pi = PI(); 
  SET lat1 = lat1 * pi / 180; 
  SET lon1 = lon1 * pi / 180; 
  SET lat2 = lat2 * pi / 180; 
  SET lon2 = lon2 * pi / 180; 
  SET q1 = COS(lon1-lon2); 
  SET q2 = COS(lat1-lat2); 
  SET q3 = COS(lat1+lat2); 
  SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );  
  RETURN 6378.388 * rads; 
END; 
| 
DELIMITER ; 

-- toronto to montreal (505km): 
select geodistkm(43.6667,-79.4167,45.5000,-73.5833); 
+----------------------------------------------+ 
| geodistkm(43.6667,-79.4167,45.5000,-73.5833) | 
+----------------------------------------------+ 
|                           505.38836669921875 | 
+----------------------------------------------+ 
  

(设置log_bin_trust_function_creators是最便捷的方法   自5.0.6以来实施的步骤确定性约定。)

Source