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
Libérer: 2024-12-17 01:45:25
original
130 Les gens l'ont consulté

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal