声明和设置变量以测试SP和查询之间的差异

时间:2013-02-10 07:28:41

标签: mysql stored-procedures procedure

我正在尝试解决另一个问题here。一位成员告诉我,为了找到问题的答案,我需要更改查询以匹配SP。为了做到这一点,我被告知要声明变量,所以我使用的变量就像我在SP中一样。我的问题是我读过这么多我的眼睛都在受伤,我无法弄清楚如何申报friggin变量。

请帮忙!!

这是我到目前为止所读到的内容:

resource 1resource 2resource 3resource 4resource 5

我可以继续。我真的被卡住了。我是SQL的新手,这让我烦恼不已。我不需要使用SP,但我真的很想,所以我可以学习dos和donts,并希望能够学到足够的帮助。

DECLARE zipcode VARCHAR(30)
DECLARE radius VARCHAR(30)
SET zipcode = 08360
SET radius = 50

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 )

我已经尝试了很多我在互联网上看到的组合,以至于我开始认为它在晚上做得太晚了。如果你看一下我看过的一些资源,你会看到我在哪里看到'@'和没有的区别。

1 个答案:

答案 0 :(得分:1)

如果要创建存储过程,则需要使用正确的语法。

请参阅:http://dev.mysql.com/doc/refman/5.5/en/create-procedure.html
请注意,在proc主体内部,您需要使用;终止每个语句。

因为你需要让MySQL知道body proc何时结束,你需要将分隔符重新声明为不是;的东西。 这将阻止MySQL在第一个“;”之后解释您的存储过程,而是一直听到$$

输入完该功能后,不要忘记将分隔符恢复为默认值。

SET DELIMITER $$

CREATE PROCEDURE QueryCustomerMenu(IN zipcode VARCHAR(30), IN radius VARCHAR(30))
BEGIN

DECLARE somevar VARCHAR(20);
SET somevar = '456';

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 $$

SET DELIMITER ;

现在您可以使用:

调用存储过程
CALL QueryCustomerMenu('09210','20');

它将返回带有CustomerNameMenuID的结果集。