MySQL CASE无法在存储过程中使用

时间:2013-07-23 21:48:56

标签: mysql

这很好用。如果我更改了@unit_type变量。正确的单位类型出现在计算中。

set @unit_type = 'kilometers';
set @lat = 50;
set @lon = 100;
set @lat2 = 51;
set @lon2 = 101;

select 
(CASE @unit_type 
    WHEN 'feet' THEN 20000000
    WHEN 'miles' THEN 3696.1
    WHEN 'meters' THEN 6979100
    WHEN 'kilometers' THEN 6979
    END
* acos( cos( radians(@lat) ) 
    * cos( radians( @lat2 ) ) 
    * cos( radians( @lon2 ) 
    - radians(@lon) ) 
    + sin( radians(@lat) ) 
    * sin( radians( @lat2 ) ) 
) ) AS distance;

然而,这不是。当我尝试运行此存储过程时,它每次都会以千米为单位返回。如果我删除公里的情况,结果为空。

CREATE PROCEDURE `anotherTest`(IN `lat` BIGINT, IN `lon` BIGINT, IN `lat2` BIGINT, IN `lon2` BIGINT, IN `unit_type` TEXT)
        LANGUAGE SQL
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN

    select 
    (CASE @unit_type 
        WHEN 'feet' THEN 20000000
        WHEN 'miles' THEN 3696.1
        WHEN 'meters' THEN 6979100
        WHEN 'kilometers' THEN 6979
        END
    * acos( cos( radians(@lat) ) 
        * cos( radians( @lat2 ) ) 
        * cos( radians( @lon2 ) 
        - radians(@lon) ) 
        + sin( radians(@lat) ) 
        * sin( radians( @lat2 ) ) 
    ) ) AS distance;
    END

我只是想了解为什么会这样,以及如何更好地编写这个来解决这个问题。

有人有什么想法吗?提前谢谢。

更新:

解决方案是从我的过程的SELECT语句中删除@。因为他们不需要访问参数。

CREATE PROCEDURE `anotherTest`(IN `lat` BIGINT, IN `lon` BIGINT, IN `lat2` BIGINT, IN `lon2` BIGINT, IN `unit_type` TEXT)
        LANGUAGE SQL
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN

    select 
    (CASE unit_type 
        WHEN 'feet' THEN 20000000
        WHEN 'miles' THEN 3696.1
        WHEN 'meters' THEN 6979100
        WHEN 'kilometers' THEN 6979
        END
    * acos( cos( radians(lat) ) 
        * cos( radians( lat2 ) ) 
        * cos( radians( lon2 ) 
        - radians(lon) ) 
        + sin( radians(lat) ) 
        * sin( radians( lat2 ) ) 
    ) ) AS distance;
    END

1 个答案:

答案 0 :(得分:1)

@unit_type是一个用户变量。在程序中,我们没有看到任何设置。 (它可以在呼叫之前的会话中设置;它将具有在会话中最后分配给它的任何值。)

我们看到传入过程的参数名为unit_type。但我们在程序中没有看到任何提及。

一个快速解决方法是在SELECT之前将@unit_type用户变量设置为参数中的值:

SET @unit_type = unit_type;

同样存在所有参数的问题,也没有对它们的引用。


解决此问题的另一个选择是引用SQL中的过程参数,替换对user_variables的引用。 (看起来快速编辑就是删除@个字符。)


用户定义的变量和过程变量之间存在显着差异。

User-defined variables http://dev.mysql.com/doc/refman/5.5/en/user-variables.html

相关问题