【问题标题】:Create a mysql function while installing a component安装组件时创建mysql函数
【发布时间】:2013-12-19 12:20:30
【问题描述】:

我想在我的 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`;

如果我从组件的控制器中运行 $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 ;

【问题讨论】:

    标签: mysql sql joomla joomla2.5


    【解决方案1】:

    DELIMITER 是一个客户端构造,告诉客户端语句的结尾在哪里,而不是服务器。

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

    【讨论】:

    • 谢谢你迈克尔,你救了我的一周:-)
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多