【问题标题】:Creating MySQL Spatial Procedure in MySQL 5.0在 MySQL 5.0 中创建 MySQL 空间过程
【发布时间】:2013-12-19 08:10:00
【问题描述】:

我发现一个程序几乎完全符合我在此页面上寻找的内容:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

我对它进行了一些修改以实际使用我的数据库,但每次我去创建函数时都会引发错误。我假设我实际上不能在 MySQL 5.0 中创建一个程序,而是我必须创建一个函数。我只需要一点帮助。我对为 MySQL 创建过程非常陌生。

DELIMITER $$
DROP FUNCTION IF EXISTS `GEODIST` $$
CREATE FUNCTION `GEODIST`( mylat float, mylong float, dist int )
BEGIN
    DECLARE lon1 float; 
    DECLARE lon2 float;
    DECLARE lat1 float; 
    DECLARE lat2 float;

set lon1 = mylon - dist/abs(cos(radians(mylat))*69);
set lon2 = mylon + dist/abs(cos(radians(mylat))*69);
set lat1 = mylat - (dist/69);
set lat2 = mylat + (dist/69);

SELECT destination.*,3956 * 2 * ASIN(SQRT( POWER(SIN((orig.lat -dest.lat) * pi()/180 / 2), 2) +COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) *POWER(SIN((orig.lon -dest.lon) * pi()/180 / 2), 2) )) as distance FROM users destination, users origin WHERE origin.id=userid
and destination.longitude between lon1 and lon2 and destination.latitude between lat1 and lat2 
having distance < dist ORDER BY Distance limit 10;

END $$

当我运行这段代码时,会抛出一个错误:

错误 SQL 查询:文档

创建函数GEODIST (

mylat FLOAT, mylong FLOAT, dist INT ) BEGIN DECLARE lon1 FLOAT;

声明 lon2 浮点数;

声明 lat1 浮点数;

声明 lat2 浮点数;

SET lon1 = mylon - dist / ABS(COS( RADIANS(mylat) ) *69 ) ;

SET lon2 = mylon + dist / ABS(COS( RADIANS( mylat ) ) *69 ) ;

SET lat1 = mylat - (dist /69);

SET lat2 = mylat + (dist /69);

选择目的地。 * , 3956 *2 * ASIN( SQRT( POWER( SIN( ( orig.lat - dest.lat ) * PI( ) /180 /2 ) , 2 ) + COS( orig.lat * PI( ) /180 ) * COS( dest.lat * PI( ) /180 ) * POWER( SIN( ( orig .lon - dest.lon ) * PI( ) /180 /2 ) , 2 ) ) ) AS 距离用户目的地,用户 origin WHERE origin.id = userid AND destination.longitude BETWEEN lon1 AND lon2 AND destination.latitude BETWEEN lat1 AND lat2 HAVING distance

END $$ MySQL 说:文档

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以了解正确的语法使用

在“开始”附近 声明 lon1 浮点数; 声明 lon2 浮点数; 在第 2 行声明 lat1 float'

编辑:下面建议我将其更改为我拥有的 PROCEDURE,但它会引发错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以了解正确的语法使用

第3行的''附近

【问题讨论】:

    标签: mysql stored-procedures geospatial spatial procedure


    【解决方案1】:

    如果您不需要从存储例程返回值,那么您需要创建一个过程,只需将CREATE FUNCTION 更改为CREATE PROCEDURE

    另外需要在函数体中添加RETURNS子句指定结果数据类型,并在函数体中添加RETURN子句设置结果值。

    CREATE PROCEDURE and CREATE FUNCTION Syntax.

    【讨论】:

    • 谢谢,我刚刚知道了。我确实改变了它,但它仍然对我抛出同样的错误。
    • 抱歉,现在我遇到了另一个错误。我刚刚更新了这个问题。感谢您的帮助!
    • 没关系,我已经启动并运行了。惊人的!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-05-28
    • 2016-11-11
    • 2017-10-14
    • 2021-07-10
    相关资源
    最近更新 更多