2010-08-18 2 views
2

mysql 저장 함수 또는 저장 프로 시저에서 나중에 실행할 수있는 문자열 변수로 mysql 쿼리를 작성할 수 있는지 궁금합니다. district_id을 mathing 행의 ID와 county_id, city_idzip_id의 조합을 반환하기위한 것입니다QUERY로 STRING 변수를 사용하는 MySQL의 stored-function

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 : 나는 테이블을 참조하는 저장 기능 get_district_part ((district_id INT,county_id INT,city_id INT,zip_id INT)) RETURNS INT 있습니다. 문제는 해당 아이디어가 포함 된 행의 ID가 아닌 ID의 정확한 조합과 일치하는 행의 ID를 반환하고 싶습니다. 이를 위해 쿼리 문을 세분화하여 제공된 ID에 맞게 작성해야합니다. 내가 할 수있는 경우 nulls와 일치하지 않으려 고 노력하고있다.

나는 이것이 PHP로 쉽게 할 수 있다는 것을 알았지 만, 다른 이유로이 모든 다른 기능을 저장할 수 있다면 mysql 저장 프로세스로 이것을하고 싶습니다.

답변

7

예, 저장 프로 시저에서 동적 SQL로 PREPAREEXECUTE 문자열을 사용할 수 있습니다.

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 문을 보면서 더 많은 시간을 보냈다. –

+0

감사합니다. 매우 유용합니다. –

+0

'@ query' 쿼리 내에서 매개 변수를 참조 할 수 있습니까? 나는 알 수없는 열 오류를 시도하고있어. – TheRealChx101