MySQL procédure stockée avec liste d'arguments variable
J'ai fait une procédure stockée. Je le veux pour filtrer les données par différents paramètres. Si je passe un paramètre, il doit être filtré par un; si je passe deux, elle devrait être filtrée par deux, et ainsi de suite, mais ça ne fonctionne pas.
Quelqu'un peut m'aider s'il vous plaît?
DROP PROCEDURE IF EXISTS medatabase.SP_rptProvince2;
CREATE PROCEDURE medatabase.`SP_rptProvince2`(
IN e_Region VARCHAR(45)
)
BEGIN
DECLARE strQuery VARCHAR(1024);
DECLARE stmtp VARCHAR(1024);
SET @strQuery = CONCAT('SELECT * FROM alldata where 1=1');
IF e_region IS NOT NULL THEN
SET @strQuery = CONCAT(@strQuery, ' AND (regionName)'=e_Region);
END IF;
PREPARE stmtp FROM @strQuery;
EXECUTE stmtp;
END;
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, vous ne pouvez pas avoir une liste d'arguments variable comme ça. Vous pouvez faire une des deux choses:
Prendre un nombre maximum fixe de paramètres, et de les vérifier pour les nuls-ness avant la concaténation:
Si vous avez besoin d'prédéterminé domaines pour lesquels les critères de l'argument s'applique (comme le
e_Region
paramètre dans votre code existant), puis vous modifiez la méthode CONCAT opération de façon appropriée.Possible invocation:
Prendre un seul paramètre qui est beaucoup plus grand que juste 45 caractères, et il suffit de l'ajouter à la requête (en supposant qu'il n'est pas null).
Clairement, il incombe donc à l'utilisateur de fournir le code SQL.
Possible invocation:
Il n'y a pas beaucoup de choses à choisir entre les deux. Soit peut être mis en oeuvre; aucune n'est entièrement satisfaisante.
Vous pouvez noter qu'il y a un besoin de protéger les chaînes de caractères dans les arguments avec des guillemets supplémentaires; c'est le genre de chose qui rend cette problématique.
CONCAT(@strQuery, ' AND regionName = ', eRegion)
, mais qui s'appuie sur l'utilisateur de saisir une chaîne de caractères comme'''South'''
comme argument). Veiller à ce que les citations sont correctement manipulés est légèrement difficile, mais très important pour éviter les Injection SQL. L'extension de cette idée d'un à cinq paramètres est une application standard de la même idée, répétée plusieurs fois.IF a1 IS NOT NULL THEN SET @strQuery = CONCAT(@strQuery, ' AND ', a2);
- Je suis un SQL complète ignorants, mais voulez-vous dire' AND ', a1);
IF a2 IS NOT NULL THEN ... ' AND ', a2);
. De toute façon, vous avez raison que j'ai un décalage entre le testé variable et la annexé variable.J'ai trouvé un basé sur JSON approche qui fonctionne avec la dernière MySQL/MariaDB systèmes. Consultez le lien ci-dessous (Auteur Original est Federico Razzoli): https://federico-razzoli.com/variable-number-of-parameters-and-optional-parameters-in-mysql-mariadb-procedures
Fondamentalement, vous prenez une GOUTTE de paramètre qui est en fait un objet JSON et puis ne JSON_UNQUOTE(JSON_EXTRACT(objet json, clé)) tant que de besoin.
Levé un extrait ici: