mysqlストアド関数内のSELECTステートメントで変数をOFFSETとして使用する
-
08-07-2019 - |
質問
mySQLデータベースのストアド関数を書くというテーマは非常に新しいので、ここでやろうとしていることが可能かどうかはわかりません。
テーブルのランダムな行から列を返す関数が必要です。そのためにORDER BY RAND()メソッドを使用したくないので、次のようにこれを行います:
DECLARE MAX_COUNT INT DEFAULT 120000;
DECLARE rand_offset INT;
DECLARE str_rnd_word VARCHAR(255);
SET rand_offset = FLOOR((RAND() * MAX_COUNT));
SELECT word INTO str_rnd_word FROM all_words LIMIT 1 OFFSET rand_offset ;
RETURN str_rnd_word;
MySQLは、そのような本体を持つ関数を作成するとエラーをスローします。ただし、ハードコードされた数値をOFFSETとして使用すると、問題なく機能します。
誰かが主題に光を当ててください。
WindowsボックスでMySQL 5.0.45を実行しています。
ありがとう
解決
5.5より前のMySQLでは、MySQLストアドプロシージャの LIMIT
句に変数を配置できません。それを文字列に補間してから、動的なクエリとして文字列を実行する必要があります。
SET rand_offset = FLOOR(RAND() * (SELECT COUNT(*) FROM all_words));
SET @sql = CONCAT('SELECT word INTO str_rnd_word FROM all_words LIMIT 1 OFFSET ', rand_offset);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
所属していません StackOverflow