好的,所以我的存储过程在其 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 新手 :))。
我也尝试更改参数的类型。在我将其更改为 INT 后,邮政编码中断了,我使用了这个:
CALL getcusbyzip(08361,50)
我得到的行是邮政编码中包含“8361”的所有行。基本上,这是我对为什么收到这么多行回复的唯一个人解释。
当我将这两个参数都设置为 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 过程逻辑中缺少的东西。老实说,我不明白为什么结果不同只是因为它在存储过程中。