这很好用。如果我更改了@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
答案 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