0

我将以下“haversin”算法实现为 SQL 函数。

DELIMITER //
CREATE FUNCTION `db`.`haversin` (slat FLOAT, slon FLOAT, dlat FLOAT, dlon FLOAT) 
RETURNS FLOAT
BEGIN
 declare alphaLon,a FLOAT;
 set alphaLon=(slon–dlon);
 set a=3956*2*ASIN(SQRT( POWER(SIN((slat - abs(dlat)) * pi()/180 / 2),2) + COS(slat * pi()/180 ) * COS(abs(dlat) *  pi()/180) * POWER(SIN((alphaLon) *  pi()/180 / 2), 2) ));
 return a;
 END 
//delimiter;

执行上述操作时,我得到一个 1064 错误“语法错误靠近 //delimiter”,但是,函数确实被创建了。

最令人困惑的是,在运行该函数时,结果如下:

mysql> SELECT haversin(2.0,45.0,2.0,1.2);
ERROR 1054 (42S22): Unknown column 'slon–dlon' in 'field list'

这怎么可能?

4

1 回答 1

1
  1. 您粘贴的代码包含对 MySQL 客户端的三个指令:

    1. 将其语句分隔符更改为//;

    2. 向服务器发送CREATE FUNCTION命令;和

    3. 一个未知的指令delimiter;

    因此,前两个命令成功,第三个命令失败。delimiter要纠正第三个命令的失败,请在关键字和所需的新分隔符之间插入空格。

  2. 存储的程序在执行之前不会被评估:因此在调用函数之前不会检测到运行时错误(例如“未知列”)。事实上,考虑到数据库模式在定义函数后可能会发生变化,这非常有意义。

    您收到此错误是因为您的减号实际上是EN DASH (U+2013)。对于算术减法,用HYPHEN-MINUS (U+002D) 替换。

于 2013-06-17T13:22:16.463 回答