MySQL逻辑:存储过程与仅具有过程主体的查询的结果不同

时间:2013-02-10 15:23:21

标签: mysql database stored-procedures

好的,所以我的存储过程在MySQL查询中读错了变量。当我只使用proc的主体时,我需要的结果很好。我想把它作为一个存储过程。

这是SQLyog中的SP:

DELIMITER $$

USE `XXXXXXXXXXXXXXX`$$

DROP PROCEDURE IF EXISTS `getcusbyzip`$$

CREATE DEFINER=`XXXXXXXXXXXXXXX`@`%` PROCEDURE `getcusbyzip`(IN zipcode VARCHAR(30), IN         radius VARCHAR(30))
BEGIN

SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (

  SELECT Z.LNG
  FROM ZipCodes Z
  WHERE Z.ZIPCODE =zipcode
  LIMIT 0 , 1
) ) ) + SIN( RADIANS( (

SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <radius
ORDER BY distance
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE );

END$$

DELIMITER ;

现在只有1个记录应该返回,因为我现在只添加了1个客户,直到我解决了这个类型的问题。这是我有突破的地方(请不要笑,我完全是SQL新手:))。

我尝试过更改TYPE以及参数。在我将其更改为INT之后,邮政编码破了,我使用了这个:

CALL getcusbyzip(08361,50)

我生成的行是“8361”在邮政编码中的所有行。基本上这是我唯一的个人解释,为什么我收到这么多行。

当我将这两个params设置为VARCHAR类型时使用它:

CALL getcusbyzip(08361,50)

CALL getcusbyzip('08361',50)

CALL getcusbyzip(08361,'50')

你明白了。

当我要回到1行时,我得到0行。

所以现在我想我知道我的问题是什么,我希望它实际上可以问它。是什么导致我的SP以不同的方式读取输入作为参数,而不是像我刚刚进行查询并手动将参数放入查询中。其次,我如何调整我的程序,以便MySQL服务器像查询一样读取我的程序,但参数是粗糙的?

以下是完全正常的查询:

SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (

  SELECT Z.LNG
  FROM ZipCodes Z
  WHERE Z.ZIPCODE =08360
  LIMIT 0 , 1
) ) ) + SIN( RADIANS( (

SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <50
ORDER BY distance
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )

编辑:

另一点值得注意的是,当我将变量更改为SP(存储过程)中的直接信息时,它不会修复它,因此它必须是我在MySQL过程逻辑中遗漏的东西。老实说,我不明白为什么结果不同只是因为它在存储过程中。

0 个答案:

没有答案