Comment construire et utiliser SQL dynamique dans une procédure stockée MySQL?
Je ne crois pas que MySQL supporte le SQL dynamique. Vous pouvez faire des déclarations "préparées" qui sont similaires, mais différentes.
Voici un exemple:
mysql> PREPARE stmt FROM
-> 'select count(*)
-> from information_schema.schemata
-> where schema_name = ? or schema_name = ?'
;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt
-> USING @schema1,@schema2
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE stmt;
Les instructions préparées sont souvent utilisées pour voir un plan d'exécution pour une requête donnée. Puisqu'ils sont exécutés avec la commande execute et que le sql peut être assigné à une variable, vous pouvez approximer certains du même comportement que le sql dynamique.
Voici un bon lien à ce sujet:
N'oubliez pas de désallouer le stmt
en utilisant la dernière ligne!
Bonne chance!
Après 5.0.13, dans les procédures stockées, vous pouvez utiliser le SQL dynamique:
delimiter //
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
SET @s = CONCAT('SELECT ',col,' FROM ',tbl );
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
//
delimiter ;
Dynamic SQL ne fonctionne pas dans les fonctions ou les déclencheurs. Voir la documentation MySQL pour plus d'utilisations.
Vous pouvez passer en dehors de l'instruction dynamique en utilisant des variables définies par l'utilisateur
Server version: 5.6.25-log MySQL Community Server (GPL)
mysql> PREPARE stmt FROM 'select "AAAA" into @a';
Query OK, 0 rows affected (0.01 sec)
Statement prepared
mysql> EXECUTE stmt;
Query OK, 1 row affected (0.01 sec)
DEALLOCATE prepare stmt;
Query OK, 0 rows affected (0.01 sec)
mysql> select @a;
+------+
| @a |
+------+
|AAAA |
+------+
1 row in set (0.01 sec)