gpt4 book ai didi

mysql - 安装组件时创建mysql函数

转载 作者:行者123 更新时间:2023-11-29 13:24:23 25 4
gpt4 key购买 nike

我想在 Joomla 2.5 组件的安装程序中包含 mysql 函数的创建。这是函数:

DELIMITER $$

DROP FUNCTION IF EXISTS getDistance $$


CREATE FUNCTION `getDistance` (
lat1 DECIMAL( 18, 12 ) ,
lng1 DECIMAL( 18, 12 ) ,
lat2 DECIMAL( 18, 12 ) ,
lng2 DECIMAL( 18, 12 )
)
RETURNS DECIMAL( 18, 12 ) DETERMINISTIC

BEGIN
DECLARE `distance` DECIMAL( 18, 12 ) ;

SELECT (
6371 *
acos( cos( radians( lat1 ) ) *
cos( radians( lat2 ) ) *
cos(
radians( lng2 ) - radians( lng1 ) ) +
sin( radians( lat1 ) ) *
sin( radians( lat2 ) ) ) )
INTO `distance`;

RETURN `distance`;

END $$

DELIMITER ;

如果我使用站点用户和密码登录 phpmyadmin,该函数就会正常创建。

我已经尝试过:

  • 将其插入到创建表的 .sql 文件中,
  • 从安装后脚本运行它(我的首选方法,因为我可以处理错误)
  • 通过管理工具栏中的按钮运行
  • 使用不同的分隔符:££
  • 用#__distance替换距离标识符

没有任何作用。

sql文件为utf8,无bom。

如果我使用 sql 安装程序,则会显示两次错误:

JInstaller: :Install: Error SQL DB function failed with error number 1327
Undeclared variable: distance SQL=SELECT ( 6371 * acos( cos( radians( lat1 ) ) * cos( radians( lat2 ) ) * cos( radians( lng2 ) - radians( lng1 ) ) + sin( radians( lat1 ) ) * sin( radians( lat2 ) ) ) ) INTO `distance`;
SQL =

SELECT (
6371 *
acos( cos( radians( lat1 ) ) *
cos( radians( lat2 ) ) *
cos(
radians( lng2 ) - radians( lng1 ) ) +
sin( radians( lat1 ) ) *
sin( radians( lat2 ) ) ) )
INTO `distance`;

如果我从组件的 Controller 中运行 $db->getErrorMsg(),这是我查询时遇到的错误。

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 ££' at line 1 SQL=DELIMITER ££ DROP FUNCTION IF EXISTS getDistance ££ CREATE FUNCTION `xxyx_getDistance` ( lat1 DECIMAL( 18, 12 ) , lng1 DECIMAL( 18, 12 ) , lat2 DECIMAL( 18, 12 ) , lng2 DECIMAL( 18, 12 ) ) RETURNS DECIMAL( 18, 12 ) DETERMINISTIC BEGIN DECLARE `xxyx_distance` DECIMAL( 18, 12 ) ; SELECT ( 6371 * acos( cos( radians( lat1 ) ) * cos( radians( lat2 ) ) * cos( radians( lng2 ) - radians( lng1 ) ) + sin( radians( lat1 ) ) * sin( radians( lat2 ) ) ) ) INTO `xxyx_distance`; RETURN `xxyx_distance`; END ££ DELIMITER ;

最佳答案

DELIMITER 是一个客户端构造,告诉客户端语句的结束位置,而不是服务器。

如果您制作一个字符串,其中包含从“CREATE FUNCTION”一直到函数定义的最后“END”的所有内容...在“END”之后不需要“DELIMITER”语句,也不需要“$$”或其他符号“...并执行该字符串作为针对您的连接对象的查询,服务器应该理解它。对于“DROP FUNCTION IF EXISTS function_name”也是如此,首先执行。

关于mysql - 安装组件时创建mysql函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20351220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com