0

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

4

0 回答 0