Maison >base de données >tutoriel mysql >Comment puis-je exécuter des requêtes SQL dynamiques dans MySQL sans utiliser EXEC ou EXECUTE ?

Comment puis-je exécuter des requêtes SQL dynamiques dans MySQL sans utiliser EXEC ou EXECUTE ?

DDD
DDDoriginal
2024-12-17 01:45:25131parcourir

How Can I Execute Dynamic SQL Queries in MySQL Without Using EXEC or EXECUTE?

Exécution de chaînes dans MySQL

L'une des tâches courantes en programmation est la capacité de générer et d'exécuter dynamiquement des requêtes SQL. Dans MySQL, cette fonctionnalité n'est pas aussi simple que dans d'autres langages comme SQL Server, qui fournit la commande EXEC à cet effet.

Problème :

Un utilisateur souhaite pour convertir une procédure stockée en MSSQL qui utilise un varchar comme requête. Cependant, EXEC et EXECUTE ne sont pas pris en charge dans MySQL, et CALL ne fonctionne pas non plus.

Solution :

Bien que MySQL n'ait pas d'équivalent exact de la fonction eval de JavaScript , il existe une solution de contournement utilisant une combinaison de SQL dynamique et de procédures stockées. Voici comment y parvenir :

  1. Préparer la requête dynamique : utilisez une table dérivée pour concaténer les valeurs à insérer, ce qui donne une seule chaîne contenant la requête SQL.
  2. Créer une instruction préparée : attribuez la requête dynamique à une variable d'instruction préparée à l'aide de PREPARE
  3. Exécuter l'instruction préparée : Exécuter l'instruction préparée à l'aide de l'instruction EXECUTE.
  4. Désallouer l'instruction préparée : Après avoir exécuté la requête, libérer la variable de l'instruction préparée à l'aide de DEALLOCATE PREPARE déclaration.

Exemple :

L'extrait de code suivant illustre la solution :

SET @queryString = (
SELECT CONCAT('INSERT INTO user_group (`group_id`,`user_id`) VALUES ', www.vals) as res FROM (
    SELECT GROUP_CONCAT(qwe.asd SEPARATOR ',') as vals FROM ( 
           SELECT CONCAT('(59,', user_id, ')') as asd FROM access WHERE residency = 9 
    ) as qwe 
) as www
);

PREPARE stmt FROM @queryString;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; 
SET @asd = NULL;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn