2010-08-18 71 views
2

我想知道是否可以在一個mysql存儲函數或存儲過程中編寫一個mysql查詢作爲字符串變量,您可以稍後執行?我有一個存儲功能get_district_part ((district_id INT,county_id INT,city_id INT,zip_id INT)) RETURNS INT引用表:MySQL,存儲函數,使用STRING變量作爲查詢

CREATE TABLE IF NOT EXISTS `modx`.covereage_district_part(
    id  INT  NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    districtID INT  NOT NULL, 
    countyID INT, 
    cityID  INT, 
    zipID  INT, 
    FOREIGN KEY (districtID) REFERENCES `modx`.coverage_district (id), 
    FOREIGN KEY (countyID) REFERENCES `modx`.coverage_county (id), 
    FOREIGN KEY (cityID) REFERENCES `modx`.coverage_city (id), 
    FOREIGN KEY (zipID) REFERENCES `modx`.coverage_zip (id) 
); 

get_distrct_part意味着返回行mathing district_id的ID和county_idcity_idzip_id某種組合。問題是我想返回匹配id的確切組合的行的id,而不是包含任何這些想法的行的id。要做到這一點,我想分割我的查詢語句,因此它是專門爲所提供的ID構建的。如果可以,我想不必匹配空值。

我意識到這可以很容易地用PHP來完成,但我想這樣做,因爲MySQL存儲過程,如果我可以沒有其他原因,那麼所有其他的功能是存儲過程。

回答

7

是的,您可以在存儲過程中將PREPAREEXECUTE一個字符串作爲動態SQL。

delimiter // 
CREATE PROCEDURE get_district_part (district_id INT, county_id INT, city_id INT, zip_id INT) 
BEGIN 
    SET @query = 'SELECT id FROM covereage_district_part WHERE 1=1'; 

    IF (district_id IS NOT NULL) THEN 
    SET @query = CONCAT(@query, ' AND districtID=', district_id); 
    END IF; 

    IF (county_id IS NOT NULL) THEN 
    SET @query = CONCAT(@query, ' AND countyID=', county_id); 
    END IF; 

    IF (city_id IS NOT NULL) THEN 
    SET @query = CONCAT(@query, ' AND cityID=', city_id); 
    END IF; 

    IF (zip_id IS NOT NULL) THEN 
    SET @query = CONCAT(@query, ' AND zipID=', zip_id); 
    END IF; 

    PREPARE stmt1 FROM @query; 

    EXECUTE stmt1; 
END // 
delimiter ; 

call get_district_part(1,1,1,1); 
call get_district_part(1,1,null,null); 

注:你不能,但是,在一個存儲函數執行動態SQL。你的問題提到用RETURNS子句聲明你的例程,這將是一個存儲函數。

+0

我曾看過'PREPARE'聲明,我將不得不花費更多的時間。 – 2010-08-18 22:28:32

+0

非常感謝您的幫助。 – 2010-08-19 17:12:24

+0

你可以引用'@ query'查詢中的參數嗎?我試過並得到了一個未知的列錯誤。 – TheRealChx101 2015-05-15 20:32:15