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

     2023-02-24     150

关键词:

【中文标题】为啥当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时出现此错误?【英文标题】:Why I obtain this error when I try to create this funcion (that use point data type) on a MariaDB database?为什么当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时出现此错误? 【发布时间】:2017-03-20 22:02:32 【问题描述】:

我对数据库不太感兴趣,我对实施本教程有以下疑问: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 还是我缺少什么? 这个函数应该存储在哪里?

【问题讨论】:

在 MySQL 中更改分隔符很重要。否则,函数定义在第一个 ; 处结束,这将使其不完整。在函数定义前添加delimiter ||,在函数定义后添加|| @juergend 我到底要做什么?这怎么可能?示例直接取自 MariaDB 网站 所以你又倒退了一步? @e4c5 不,我只是想将此语句执行到我的数据库中以创建此功能 @juergend 我该把这个分隔符放在哪里?请你给我一个完整的回复显示我的代码吗?所以我会接受它:-) 【参考方案1】:

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

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 ;

【讨论】:

好的,它工作正常,现在创建函数。最后一个问题:这个函数存储在哪里?我怎样才能在我的数据库中看到它? (例如使用 PhpMyAdmin) 我不使用 phpMyAdmin。但我相信你可以用谷歌搜索 存储在数据库中。你要文件名吗?要不然是啥?你可以在information_schema.ROUTINES看到它。 ***.com/questions/733349/…

为啥我在尝试创建此表时不断收到外键错误? [复制]

...发布时间】:2019-07-1015:00:12【问题描述】:我正在尝试为数据库创建表。一切都很好,除了当我尝试创建最后一个连接表时,它一直给我一个外键错误“使用外键约束创建表\' 查看详情

如何在 MariaDb 中使用排名函数

】如何在MariaDb中使用排名函数【英文标题】:HowtouseRankFunctioninMariaDb【发布时间】:2017-06-0811:04:07【问题描述】:我正在尝试在MariaDB上使用排名函数。我已经在我的桌子上创建了某种RANK()实现,但它不能正常工作。我尝试过的... 查看详情

MariaDB 命令不同步

...始化git时,我无法这样做,因为我的MariaDB抛出此错误:数据库设置无效:命令不同步。您是否一次运行多个语句?有人可以帮助我吗?我尝试安装GOG和Gitea,但都抛出相同的错误【问题讨论】 查看详情

函数创建时编译错误成功,为啥?

】函数创建时编译错误成功,为啥?【英文标题】:successwithcompilationerroronFunctioncreation,why?函数创建时编译错误成功,为什么?【发布时间】:2016-12-0711:46:31【问题描述】:我尝试在OracleApex5,SQL命令中创建此函数,并导致此错... 查看详情

为啥 pool.map 会删除数据操作?

】为啥pool.map会删除数据操作?【英文标题】:Whyispool.mapremovingdataoperations?为什么pool.map会删除数据操作?【发布时间】:2021-09-0508:43:39【问题描述】:我有一个特定的函数,它在一个全局定义的numpy矩阵上运行并改变这个矩阵中... 查看详情

为啥在创建后立即调用此析构函数?

】为啥在创建后立即调用此析构函数?【英文标题】:Whyisthisdestructorbeingcalledimmediatelyaftercreation?为什么在创建后立即调用此析构函数?【发布时间】:2012-02-1022:13:05【问题描述】:我有以下课程:classFixedByteStreampublic:FixedByteStrea... 查看详情

当我尝试使用 adb shell 打开数据库时,为啥在根植的 Nexus One 上出现“sqlite3:未找到”错误?

】当我尝试使用adbshell打开数据库时,为啥在根植的NexusOne上出现“sqlite3:未找到”错误?【英文标题】:WhydoIgeta"sqlite3:notfound"erroronarootedNexusOnewhenItrytoopenadatabaseusingtheadbshell?当我尝试使用adbshell打开数据库时,为什么在... 查看详情

为啥在尝试定义函数体时会出现此编译器错误?

】为啥在尝试定义函数体时会出现此编译器错误?【英文标题】:WhydoIgetthiscompilererrortryingtodefineafunctionbody?为什么在尝试定义函数体时会出现此编译器错误?【发布时间】:2015-06-0710:31:54【问题描述】://PrintsaboxofX\'swithuserunputof... 查看详情

对于mariadb,是否有必要在我使用的每个函数上创建和关闭连接?(代码片段)

我对关于MariaDB连接使用的良好实践有一些疑问,我已经创建了一个包含某些功能的库,因此我创建了连接/创建游标/.../关闭游标/关闭连接,每个函数如下:defFunc1():cnx=mariadb.connect(host,user,pass,db)cursor=cnx.cursor()do...Queryandsomethingelse... 查看详情

为啥在尝试使用指针访问结构时出现此分段错误?

】为啥在尝试使用指针访问结构时出现此分段错误?【英文标题】:whyamigettingthissegmentationfaultwhentryingtoaccessastructusingapointer?为什么在尝试使用指针访问结构时出现此分段错误?【发布时间】:2020-12-1206:21:22【问题描述】:我正... 查看详情

在 null 上调用成员函数 connection()

...上的一个项目创建一个新的虚拟开发环境。我已经安装了MariaDB,PHP7,对存储库进行了本地克隆,并恢复了它的.env文件。它应该可以工作。不幸的是,当我输入phpartisan和composerupda 查看详情

为啥在尝试运行此可执行文件时出现错误?

】为啥在尝试运行此可执行文件时出现错误?【英文标题】:WhydoIgetanerrorwhentryingtorunthisexecutablefile?为什么在尝试运行此可执行文件时出现错误?【发布时间】:2015-08-2416:59:25【问题描述】:我正在尝试将python3应用程序部署到具... 查看详情

为啥在尝试调用采用动态参数的基本构造函数/方法时会出现此编译错误?

】为啥在尝试调用采用动态参数的基本构造函数/方法时会出现此编译错误?【英文标题】:WhydoIgetthiscompileerrortryingtocallabaseconstructor/methodthattakesadynamicargument?为什么在尝试调用采用动态参数的基本构造函数/方法时会出现此编译... 查看详情

为啥我可以在 Windows 7 上使用 XAMPP 登录 MariaDB

】为啥我可以在Windows7上使用XAMPP登录MariaDB【英文标题】:WhydoamiabletologintoMariaDBusinganythingwithXAMPPonWindows7为什么我可以在Windows7上使用XAMPP登录MariaDB【发布时间】:2017-05-0117:22:56【问题描述】:我是Windows7上xampp的新手,通常我在d... 查看详情

尝试使用此代码在 TLS 上运行 TLS 时,为啥会出现握手失败?

】尝试使用此代码在TLS上运行TLS时,为啥会出现握手失败?【英文标题】:WhyisthereahandshakefailurewhentryingtorunTLSoverTLSwiththiscode?尝试使用此代码在TLS上运行TLS时,为什么会出现握手失败?【发布时间】:2011-07-0501:03:36【问题描述】... 查看详情

为啥我不能在 MessageBox 上显示此字符串? [复制]

】为啥我不能在MessageBox上显示此字符串?[复制]【英文标题】:Whycan\'tIdisplaythisstringonMessageBox?[duplicate]为什么我不能在MessageBox上显示此字符串?[复制]【发布时间】:2014-08-1910:46:54【问题描述】:我创建了一个指向几个字符的指... 查看详情

为啥在尝试将firebase添加到flutter时出现此错误“已弃用的API”

】为啥在尝试将firebase添加到flutter时出现此错误“已弃用的API”【英文标题】:whyhavingthiserror\'deprecatedAPI\'whentryingaddedfirebasetoflutter为什么在尝试将firebase添加到flutter时出现此错误“已弃用的API”【发布时间】:2021-06-0816:07:55【... 查看详情

当 SQL 在 SQL 选项卡中正常运行时,为啥创建此视图会导致错误 1350?

】当SQL在SQL选项卡中正常运行时,为啥创建此视图会导致错误1350?【英文标题】:WhydoescreatingthisViewcauseError1350whentheSQLrunsproperlyinanSQLtab?当SQL在SQL选项卡中正常运行时,为什么创建此视图会导致错误1350?【发布时间】:2017-12-1916... 查看详情