2013-07-23 39 views
0

這工作正常。如果我更改@unit_type變量。計算中出現正確的單位類型。MySQL CASE不能在存儲過程中工作

set @unit_type = 'kilometers'; 
set @lat = 50; 
set @lon = 100; 
set @lat2 = 51; 
set @lon2 = 101; 

select 
(CASE @unit_type 
    WHEN 'feet' THEN 20000000 
    WHEN 'miles' THEN 3696.1 
    WHEN 'meters' THEN 6979100 
    WHEN 'kilometers' THEN 6979 
    END 
* acos(cos(radians(@lat)) 
    * cos(radians(@lat2)) 
    * cos(radians(@lon2) 
    - radians(@lon)) 
    + sin(radians(@lat)) 
    * sin(radians(@lat2)) 
)) AS distance; 

但是,這並不是。當我嘗試運行這個存儲過程時,它每次都會以公里爲單位返回。如果我刪除公里的情況下,結果爲空。

CREATE PROCEDURE `anotherTest`(IN `lat` BIGINT, IN `lon` BIGINT, IN `lat2` BIGINT, IN `lon2` BIGINT, IN `unit_type` TEXT) 
     LANGUAGE SQL 
     NOT DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
    BEGIN 

    select 
    (CASE @unit_type 
     WHEN 'feet' THEN 20000000 
     WHEN 'miles' THEN 3696.1 
     WHEN 'meters' THEN 6979100 
     WHEN 'kilometers' THEN 6979 
     END 
    * acos(cos(radians(@lat)) 
     * cos(radians(@lat2)) 
     * cos(radians(@lon2) 
     - radians(@lon)) 
     + sin(radians(@lat)) 
     * sin(radians(@lat2)) 
    )) AS distance; 
    END 

我只是想明白這是爲什麼,以及如何更好地寫出來解決這個問題。

任何人有任何想法?提前致謝。

更新:

解決的辦法是從我的程序的SELECT語句中刪除@的。因爲它們不需要訪問參數。

CREATE PROCEDURE `anotherTest`(IN `lat` BIGINT, IN `lon` BIGINT, IN `lat2` BIGINT, IN `lon2` BIGINT, IN `unit_type` TEXT) 
     LANGUAGE SQL 
     NOT DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
    BEGIN 

    select 
    (CASE unit_type 
     WHEN 'feet' THEN 20000000 
     WHEN 'miles' THEN 3696.1 
     WHEN 'meters' THEN 6979100 
     WHEN 'kilometers' THEN 6979 
     END 
    * acos(cos(radians(lat)) 
     * cos(radians(lat2)) 
     * cos(radians(lon2) 
     - radians(lon)) 
     + sin(radians(lat)) 
     * sin(radians(lat2)) 
    )) AS distance; 
    END 

回答

1

@unit_type是一個用戶變量。我們在程序中看不到任何正在設置的地方。 (它可以在通話前的會話中設置;它將具有在會話中最後分配給它的任何值)。

我們看到傳入過程的參數名爲unit_type。但我們在程序中沒有看到任何提及。

一個快速的解決將是設置@unit_type用戶變量,之前立即SELECT,從參數值:

SET @unit_type = unit_type; 

同樣的問題對所有的參數中也存在,有沒有參考他們要麼。


解決這個問題的另一個選擇是引用SQL中的過程參數,將引用替換爲user_variables。 (貌似快速編輯會有隻是刪除@字符)。


用戶定義變量和程序變量之間的顯著差異。

User-defined variables http://dev.mysql.com/doc/refman/5.5/en/user-variables.html

+0

原來的基礎上,你告訴我在這裏,我所要做的就是刪除@的距離,我試圖從我的發言中調用的參數。 – Knight