mysql - 当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时,为什么会出现此错误?

标签 mysql database phpmyadmin mariadb mysql-spatial

我不太喜欢数据库,并且我对实现本教程有以下疑问:https://mariadb.org/jquery-and-gis-distance-in-mariadb/

所以基本上我的疑问与这个 SQL 语句有关,该语句创建一个函数来计算 MariaDB 数据库上两个之间的距离:

CREATE FUNCTION earth_circle_distance(point1 point, point2 point) RETURNS double
    DETERMINISTIC
begin
  declare lon1, lon2 double;
  declare lat1, lat2 double;
  declare td double;
  declare d_lat double;
  declare d_lon double;
  declare a, c, R double;

  set lon1 = X(GeomFromText(AsText(point1)));
  set lon2 = X(GeomFromText(AsText(point2)));
  set lat1 = Y(GeomFromText(AsText(point1)));
  set lat2 = Y(GeomFromText(AsText(point2)));

  set d_lat = radians(lat2 - lat1);
  set d_lon = radians(lon2 - lon1);

  set lat1 = radians(lat1);
  set lat2 = radians(lat2);

  set R = 6372.8; -- in kilometers

  set a = sin(d_lat / 2.0) * sin(d_lat / 2.0) + sin(d_lon / 2.0) * sin(d_lon / 2.0) * cos(lat1) * cos(lat2);
  set c = 2 * asin(sqrt(a));

  return R * c;
end

我的问题是,执行上一条语句时,我收到以下错误消息:

Error
----------------------------------------------------
Static analysis:

2 errors were found during analysis.
    1. Unrecognized data type. (near "point" at position 45)
    2. Unrecognized data type. (near "point" at position 59)

SQL query:

CREATE FUNCTION earth_circle_distance(point1 point, point2 point) RETURNS double DETERMINISTIC begin declare lon1, lon2 double 

MySQL said: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 4

PhpMyAdmin 用 2 个红色标记标记上一条语句第一行的 point 数据类型:

CREATE FUNCTION earth_circle_distance(point1 point, point2 point) RETURNS double

但我不认为这可能是真正的问题(我认为这可能是 PhpMyAdmin 不知道的事情),因为它也将此 cration 查询标记为红色:

CREATE TABLE gis_point  (g POINT);

但它工作正常,没有给我错误并正确创建表。

那么,哪里出了问题?可能取决于 PhpMyAdmin 或者我错过了什么? 这个函数应该存储在哪里?

最佳答案

更改分隔符。否则,函数定义在第一个 ; 处结束,这将使其不完整。

delimiter ||
CREATE FUNCTION earth_circle_distance(point1 point, point2 point) RETURNS double
    DETERMINISTIC
begin
  declare lon1, lon2 double;
  declare lat1, lat2 double;
  declare td double;
  declare d_lat double;
  declare d_lon double;
  declare a, c, R double;

  set lon1 = X(GeomFromText(AsText(point1)));
  set lon2 = X(GeomFromText(AsText(point2)));
  set lat1 = Y(GeomFromText(AsText(point1)));
  set lat2 = Y(GeomFromText(AsText(point2)));

  set d_lat = radians(lat2 - lat1);
  set d_lon = radians(lon2 - lon1);

  set lat1 = radians(lat1);
  set lat2 = radians(lat2);

  set R = 6372.8; -- in kilometers

  set a = sin(d_lat / 2.0) * sin(d_lat / 2.0) + sin(d_lon / 2.0) * sin(d_lon / 2.0) * cos(lat1) * cos(lat2);
  set c = 2 * asin(sqrt(a));

  return R * c;
end
||

delimiter ;

关于mysql - 当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时,为什么会出现此错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40467244/

相关文章:

mysql - 我怎样才能改进这个 4 计数自连接?

javascript - 在 MySQL 中使用多数据库查询与单数据库查询的比较

php - SQL QUERY 没有得到我期望的结果

MySQL super 权限错误1227

phpmyadmin - 如何在 PHPmyadmin 中禁用单元格 CLICK 上的内联编辑

MySQL嵌套查询不会运行,在SQL Server上运行

javascript - Beaglebone Black Rev C Debian,从 html 运行 PHP 程序

mysql - 选择要更新的查询

database - 在单独的监视器上显示 SQL 日志

ios - Realm swift : Database won't be updated after backup