2013-02-10 2 views
1

다른 문제를 해결하려고합니다 here. 회원이 내 문제에 대한 답변을 찾으려면 SP와 일치하도록 쿼리를 변경해야한다고 들었습니다. 그렇게하기 위해서 나는 변수를 선언하도록 말했고, 그래서 저는 SP에있는 변수를 사용하고 있습니다. 내 문제는 내가 너무 많이 읽었 기 때문에 눈이 아플 뿐이고 friggin 변수를 선언하는 방법을 알 수 없다.SP와 쿼리의 차이를 테스트하기 위해 변수 선언 및 설정

도와주세요 !!

resource 1, resource 2, resource 3, resource 4, resource 5

을 내가 온에 갈 수 :

이것은 내가 지금까지 읽은 내용입니다. 나는 문자 그대로 붙어있다. 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) 

는 나는 그것의 너무 늦은 밤에 더 아무것도 할 생각이 들기 시작하고 내가 인터넷에서 본 것을에서 많은 조합을 시도했다. 내가 본 자원 중 일부를 살펴 본다면 '@'과없는 차이점을 볼 수 있습니다.

답변

1

저장 프로 시저를 만들려면 적절한 구문을 사용해야합니다.

은 참조 : proc 디렉토리 몸 안에 당신이 ;와 각각의 모든 문을 종료해야합니다 http://dev.mysql.com/doc/refman/5.5/en/create-procedure.html
하는 것으로.

바디 프로 시저가 끝날 때 MySQL에 알려야하므로 구분자를 ;이 아닌 것으로 다시 선언해야합니다. 이렇게하면 MySQL이 저장된 'proc'를 첫 번째 ';'다음에 해석하지 않고 대신 $$까지들을 수 있습니다.

기능을 입력 한 후에 구분 기호를 기본값으로 되 돌리는 것을 잊지 마십시오.

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