我有一个用例,需要在存储过程中创建一个具有唯一名称的临时表。我发现使用动态表名执行查询的唯一方法是准备查询:
SET @d=CONCAT('SELECT * FROM table_', case);
PREPARE q from @d;
EXECUTE q;
这很好用,但我无法弄清楚如何返回结果集。有什么想法吗?
答案 0 :(得分:0)
您无需执行任何额外操作即可返回结果集。它足以执行准备好的查询。该查询执行的结果集将自动成为存储过程的结果集。
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在警告时错误地中止 在存储的例程和触发器中。