ストアド プロシージャ内から一意の名前を持つ一時テーブルを作成する必要があるユース ケースがあります。動的テーブル名でクエリを実行する唯一の方法は、クエリを準備することです。
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 が誤って中止されました。
https://dba.stackexchange.com/questions/7499/function-returning-no-data-zero-rows-fetched-selected-or-processed-in-mysqも参照してください