好的,所以我的存储过程在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过程逻辑中遗漏的东西。老实说,我不明白为什么结果不同只是因为它在存储过程中。