query - prepare mysql procedure
Cómo tener SQL dinámico en MySQL Procedimiento almacenado (3)
Después de 5.0.13, en procedimientos almacenados, puede usar SQL dinámico:
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 dinámico no funciona en funciones o disparadores. Consulte la documentación de MySQL para más usos.
¿Cómo construyes y usas sql dinámico en un procedimiento almacenado de MySQL?
No creo que MySQL admita SQL dinámico. Puede hacer declaraciones "preparadas" que son similares, pero diferentes.
Aquí hay un ejemplo:
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;
Las declaraciones preparadas a menudo se utilizan para ver un plan de ejecución para una consulta determinada. Como se ejecutan con el comando de ejecución y el sql se puede asignar a una variable, puede aproximarse al comportamiento similar a sql dinámico.
Aquí hay un buen link sobre esto:
¡No olvide desasignar el stmt
usando la última línea!
¡Buena suerte!
Puede pasar a través de la declaración dinámica utilizando variables definidas por el usuario
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)