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

Mysql 声明和设置变量以测试SP和查询之间的差异,mysql,stored-procedures,procedure,Mysql,Stored Procedures,Procedure,我正试图解决另一个问题。一位成员告诉我,为了找到问题的答案,我需要更改查询以匹配SP。为了做到这一点,我被告知要声明变量,所以我使用变量就像我在SP中一样。我的问题是我读了太多的书,眼睛都痛了,我不知道如何声明变量 请帮忙 这是我到目前为止读到的: ,, , , 我可以继续下去。我真的被卡住了。我是SQL新手,这让我很烦。我不需要使用SP,但我真的很想这样做,这样我就可以学习应该做什么和不应该做什么,并希望能学到足够的东西来帮助别人 DECLARE zipcode VARCHAR(30) DEC

我正试图解决另一个问题。一位成员告诉我,为了找到问题的答案,我需要更改查询以匹配SP。为了做到这一点,我被告知要声明变量,所以我使用变量就像我在SP中一样。我的问题是我读了太多的书,眼睛都痛了,我不知道如何声明变量

请帮忙

这是我到目前为止读到的:

,, , ,

我可以继续下去。我真的被卡住了。我是SQL新手,这让我很烦。我不需要使用SP,但我真的很想这样做,这样我就可以学习应该做什么和不应该做什么,并希望能学到足够的东西来帮助别人

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 )

我从网上看到的东西中尝试了很多组合,我开始觉得现在做更多的事情已经太晚了。如果你看一看我看过的一些资源,你会发现我看到了带@和不带@的区别

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

见: 请注意,在proc主体中,您需要使用;终止每个语句

因为您需要让MySQL知道body进程何时结束,并且需要将分隔符重新声明为非a;。 这将阻止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 ;

它将返回一个带有CustomerName和MenuID的结果集。

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

见: 请注意,在proc主体中,您需要使用;终止每个语句

因为您需要让MySQL知道body进程何时结束,并且需要将分隔符重新声明为非a;。 这将阻止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 ;

它将返回一个带有CustomerName和MenuID的resultset。

这解释了为什么我不能声明变量。非常感谢!这就解释了为什么我不能声明变量。非常感谢!请回答我的问题。