我有一个用例需要在存储过程中创建一个具有唯一名称的临时表。我发现使用动态表名执行查询的唯一方法是准备查询:
SET @d=CONCAT('SELECT * FROM table_', case);
PREPARE q from @d;
EXECUTE q;
这工作得很好,但我不知道如何返回结果集。有任何想法吗?
我有一个用例需要在存储过程中创建一个具有唯一名称的临时表。我发现使用动态表名执行查询的唯一方法是准备查询:
SET @d=CONCAT('SELECT * FROM table_', case);
PREPARE q from @d;
EXECUTE q;
这工作得很好,但我不知道如何返回结果集。有任何想法吗?
您无需执行任何额外操作即可返回结果集。执行准备好的查询就足够了。该查询执行的结果集将自动成为存储过程的结果集。
mysql> DELIMITER !!
mysql> CREATE PROCEDURE p()
-> BEGIN
-> SET @sql := CONCAT('SELECT ', '123 as foo');
-> PREPARE q FROM @sql;
-> EXECUTE q;
-> END!!
mysql> DELIMITER ;
mysql> CALL p;
+-----+
| foo |
+-----+
| 123 |
+-----+
回复您的评论:可能是这个错误:http ://bugs.mysql.com/bug.php?id=20028已修复。
您可以通过升级来解决问题。
在 5.0.30(不是 5.0.29)、5.1.13 变更日志中注明。
使用 SQL_MODE=TRADITIONAL,MySQL 错误地因存储例程和触发器中的警告而中止。