web-dev-qa-db-fra.com

Comment avoir Dynamic SQL dans la procédure stockée MySQL

Comment construire et utiliser SQL dynamique dans une procédure stockée MySQL?

60
Brian Boatright

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!

46
Jason Stevenson

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.

105
TimoSolo

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)
2
Elcio