如何在MySQL存储过程中有dynamicSQL

如何在MySQL存储过程中构build和使用dynamicSQL?

我不相信MySQL支持dynamicSQL。 你可以做“准备好”的陈述,这些陈述是相似但不同的。

这里是一个例子:

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; 

准备的语句通常用于查看给定查询的执行计划。 由于它们是使用execute命令执行的,并且可以将sql分配给variables,所以可以近似与dynamicsql相同的行为。

这是一个很好的链接 :

不要忘记使用最后一行来释放stmt

祝你好运!

在5.0.13之后,在存储过程中,可以使用dynamicSQL:

 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 ; 

dynamicSQL在函数或触发器中不起作用。 查看MySQL文档以获得更多的用途。

您可以使用用户定义的variables传递到dynamic语句外部

 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)