Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête dynamique mysql dans une procédure stockée

Code d'erreur :1054. Colonne 'SPA' inconnue dans 'clause where'

Cela se produit lorsque vous ne mettez pas la chaîne d'entrée entre guillemets et que le moteur SQL tente de l'identifier en tant que colonne dans la table interrogée. Mais il échoue car il ne peut pas le trouver.

Mais que se passe-t-il lorsqu'il trouve une telle colonne ?
Il récupère les résultats lorsqu'il trouve des correspondances sur les valeurs de la colonne.
Évidemment, ce n'est pas ce à quoi on s'attendait.

Comment surmonter cela? Utilisez des instructions préparées avec des valeurs d'entrée dynamiques.

Vous pouvez utiliser des espaces réservés comme ? dans les procédures stockées également sur les valeurs d'entrée dynamiques à utiliser avec Prepared Statements . Le moteur gère les caractères d'échappement et autres valeurs de chaîne lorsqu'ils sont affectés ou comparés dans des expressions SQL.

Il vous suffit de réaffecter les entrées de procédure à une ou plusieurs variables de session, selon les besoins.

Exemple de votre procédure :

CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
  SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
  SET @w_team := w_team;

  PREPARE stmt3 FROM @t1;
  EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
  DEALLOCATE PREPARE stmt3;
END;