2008-10-10 2 views

ответ

42

Я не верю, что MySQL поддерживает динамический sql. Вы можете делать «подготовленные» утверждения, похожие, но разные.

Вот пример:

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; 

Подготовленные заявления часто используются, чтобы увидеть план выполнения для данного запроса. Поскольку они выполняются с помощью команды , команда и sql может быть присвоена переменной, которую вы можете приблизить к той же самой динамике, что и динамический sql.

Вот хороший link об этом:

Не забудьте освобождать stmt используя последнюю строку!

Удачи!

+3

она не работает, когда `? 'Находится в месте имени таблицы – 2010-01-11 19:50:04

91

После 5.0.13, в хранимых процедурах, вы можете использовать динамический SQL:

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 не работает функций или триггеров. См. the MySQL documentation для более широкого использования.

2

Вы можете пройти через вне динамический оператор с помощью определяемых пользователем переменных

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) 
Смежные вопросы