1

我有一个用例需要在存储过程中创建一个具有唯一名称的临时表。我发现使用动态表名执行查询的唯一方法是准备查询:

SET @d=CONCAT('SELECT * FROM table_', case); 
PREPARE q from @d;
EXECUTE q;

这工作得很好,但我不知道如何返回结果集。有任何想法吗?

4

1 回答 1

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 错误地因存储例程和触发器中的警告而中止。

另请参阅https://dba.stackexchange.com/questions/7499/function-returning-no-data-zero-rows-fetched-selected-or-processed-in-mysq

于 2013-01-31T20:50:05.257 回答