2017-02-08 1 views
0

Je suis totalement nouveau avec la procédure stockée et j'essaie de comprendre ses concepts de base. C'est mon premier et bien sûr il y a quelque chose qui ne va pas.MySql Procédure stockée O WH "variabilisée" selon un paramètre

Fondamentalement, la requête va être la même (l'original est plus complexe et il y a d'autres opérations) mais la clause WHERE change en fonction du paramètre selType. Donc ce que j'essaie de faire est une sorte de "variabilisation" de la clause WHERE en fonction de la valeur param. Je ne sais pas si c'est la bonne approche et, si oui, quel est le problème.

DELIMITER // 

CREATE PROCEDURE `testProcedure` (IN addressId INT, IN selType BOOLEAN) 
BEGIN 
DECLARE whereUserCriteria VARCHAR(127); 
IF selType = 1 THEN 
    SET whereUserCriteria = CONCAT('address_id = ', addressId); 
ELSE 
    SET whereUserCriteria = 'address_id = 1'; 
END IF; 

SELECT whatever 
FROM wherever AS ad 
WHERE whereUserCriteria ; 

END // 

Il est agréable de voir que quand il ne variabilised, cela fonctionne parfaitement mais, dès que j'utiliser une variable pour le rendre dynamique, il cesse de fonctionner. Bien sûr, il s'agit d'un simple exemple visant à comprendre quelle est la meilleure approche dans des cas comme celui-ci.

+0

Si vous voulez créer un contrôle de requête dynamique [** this **] (http://stackoverflow.com/a/5728155/3470178) –

Répondre

2

Vous pouvez préparer la requête concaténer les requêtes et l'état ensemble et exécuter que l'utilisation Préparée instruction d'exécution comme suit (comme mentionné dans le commentaire ci-dessus):

DELIMITER // 

CREATE PROCEDURE `testProcedure` (IN addressId INT, IN selType BOOLEAN) 
BEGIN 
DECLARE whereUserCriteria VARCHAR(127); 
IF selType = 1 THEN 
    SET whereUserCriteria = CONCAT('address_id = ', addressId); 
ELSE 
    SET whereUserCriteria = 'address_id = 1'; 
END IF; 

SET @myQuery = ''; 
SET @myQuery = CONCAT("SELECT whatever FROM wherever AS ad 
WHERE ",whereUserCriteria,") ; 
PREPARE stmQuery FROM @myQuery; 
EXECUTE stmQuery; 
DEALLOCATE PREPARE stmQuery; 

END // 

DELIMITER ; 
0

Vous voulez probablement faire une requête dynamique.

Mais vous pouvez réécrire votre échantillon en utilisant CASE comme celui-ci (mais pas sûr que ce soit ce que vous voulez):

SELECT whatever 
FROM wherever AS ad 
WHERE address_id = CASE WHEN selType = 1 
         THEN addressId 
         ELSE 1 
        END;