2008-10-10 9 views

Répondre

42

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!

+3

il ne fonctionne pas lorsque le '?' Est à la place du nom de la table –

+0

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. –

+1

Apparemment, ils étudient [EXECUTE IMMEDIATE] (http://dev.mysql.com/worklog/task/?id=2793) pour les futures versions. –

91

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.

2

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) 
Questions connexes