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 に答える