2013-02-10 52 views
1

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

请帮忙!!

这是我到目前为止阅读:

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

如果你想创建一个存储过程,你需要使用正确的语法。

请参见: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的。

+0

这解释了为什么我无法获取声明的变量。非常感谢!为我的查询。 – Mark 2013-02-10 14:45:00