2012-05-18 26 views
7

ストアドプロシージャを作成しようとしています。ここで私は今のところ(動作していない)持っているものです。SELECTステートメントからMySQLストアドプロシージャ変数

DELIMITER | 
CREATE PROCEDURE getNearestCities(IN cityID INT) 
    BEGIN 
     DECLARE cityLat FLOAT; 
     DECLARE cityLng FLOAT; 
     SET cityLat = SELECT cities.lat FROM cities WHERE cities.id = cityID; 
     SET cityLng = SELECT cities.lng FROM cities WHERE cities.id = cityID; 
     SELECT *, HAVERSINE(cityLat,cityLng, cities.lat, cities.lng) AS dist FROM cities ORDER BY dist LIMIT 10; 
    END | 

半正矢は正常に動作し、私が作成した関数です。あなたが見ることができるように、私は都市のテーブルから都市のidを取得し、次にcityLatとcityLngをそのレコードの他の値に設定しようとしています。私は明らかにSELECTを使用してここで間違っています。

これも可能ですか?それはすべきだと思われる。どんな助けでも大いに感謝されます。あなたがMySQLのSELECT ... INTO構文を使用することができ、また

SET cityLat = (SELECT cities.lat FROM cities WHERE cities.id = cityID); 

答えて

12

いくつかの問題を修正し、必要に応じて代替選択 - 削除を追加しました。

DELIMITER | 

CREATE PROCEDURE getNearestCities 
(
IN p_cityID INT -- should this be int unsigned ? 
) 
BEGIN 

DECLARE cityLat FLOAT; -- should these be decimals ? 
DECLARE cityLng FLOAT; 

    -- method 1 
    SELECT lat,lng into cityLat, cityLng FROM cities WHERE cities.cityID = p_cityID; 

    SELECT 
    b.*, 
    HAVERSINE(cityLat,cityLng, b.lat, b.lng) AS dist 
    FROM 
    cities b 
    ORDER BY 
    dist 
    LIMIT 10; 

    -- method 2 
    SELECT 
     b.*, 
     HAVERSINE(a.lat, a.lng, b.lat, b.lng) AS dist 
    FROM  
     cities AS a 
    JOIN cities AS b on a.cityID = p_cityID 
    ORDER BY 
     dist 
    LIMIT 10; 

END | 

delimiter ; 
13

は、あなたは、単に彼らがサブクエリであることを示すために、括弧であなたのSELECT文を同封する必要があります。このアプローチの一つの利点は、cityLatcityLngの両方が単一の表アクセスから割り当てることができることである。

SELECT lat, lng INTO cityLat, cityLng FROM cities WHERE id = cityID; 

しかし、全体の手順は、単一の自己接合SELECTステートメントで置き換えることができる。

SELECT b.*, HAVERSINE(a.lat, a.lng, b.lat, b.lng) AS dist 
FROM  cities AS a, cities AS b 
WHERE a.id = cityID 
ORDER BY dist 
LIMIT 10; 
関連する問題