Comment créer et utiliser dynamiquement SQL dans une procédure stockée MySQL?Comment avoir du SQL dynamique dans une procédure stockée MySQL
Répondre
Je ne crois pas que MySQL supporte 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 déclarations préparées sont souvent utilisés pour voir un plan d'exécution pour une requête donnée. Comme ils sont exécutés avec la commande , exécutez la commande et que le sql peut être affecté à une variable, vous pouvez utiliser le même comportement que le SQL dynamique.
est ici un bon link à ce sujet:
Ne pas oublier de désaffecter le stmt
en utilisant la dernière ligne!
Bonne chance!
Après 5.0.13, dans les procédures stockées, vous pouvez utiliser 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 ;
SQL dynamique ne fonctionne pas dans les fonctions ou les déclencheurs. Voir the MySQL documentation pour plus d'utilisations.
Vous pouvez passer à travers dehors de l'instruction dynamique à l'aide de 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)
il ne fonctionne pas lorsque le '?' Est à la place du nom de la table –
Essayez-vous cette via console mysql? ou en utilisant une autre méthode, si vous utilisez ceci dans le code, votre fournisseur devra le supporter. –
Apparemment, ils étudient [EXECUTE IMMEDIATE] (http://dev.mysql.com/worklog/task/?id=2793) pour les futures versions. –