2010-08-18 17 views
2

Je me demandais s'il est possible dans une fonction stockée ou une procédure stockée mysql de composer une requête mysql comme une variable de chaîne que vous pouvez exécuter plus tard? J'ai une fonction stockée get_district_part ((district_id INT,county_id INT,city_id INT,zip_id INT)) RETURNS INT qui fait référence à la table:MySQL, la fonction stockée, en utilisant la variable STRING comme QUERY

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 est censé renvoyer l'identifiant de lignes mathing district_id et une combinaison de county_id, city_id et zip_id. La chose est que je veux retourner l'id de la rangée correspondant à la combinaison exacte des identifiants et non les identifiants des lignes qui contiennent l'une de ces idées. Pour ce faire, je souhaite segmenter mon instruction de requête afin qu'elle soit spécifique aux identifiants fournis. J'essaie de ne pas avoir à faire correspondre les valeurs nulles si je le peux.

Je réalise que cela peut être facilement fait avec PHP, mais je voudrais le faire en tant que processus stocké mysql si je peux pour aucune autre raison alors toutes les autres fonctions pour cela sont des processus stockés.

Répondre

7

Oui, vous pouvez PREPARE et EXECUTE une chaîne en tant que SQL dynamique dans une procédure stockée.

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); 

Note: Vous ne pouvez cependant exécuter SQL dynamique dans une fonction stockée. Votre question mentionne déclarer votre routine avec une clause RETURNS qui serait une fonction stockée.

+0

J'avais regardé l'instruction 'PREPARE' que je devrais passer plus de temps dessus. –

+0

Merci, c'est extrêmement utile. –

+0

Pouvez-vous référencer les paramètres dans la requête '@ query'? J'ai essayé et j'ai eu une erreur de colonne inconnue. – TheRealChx101