mysqlストアド関数内のSELECTステートメントで変数をOFFSETとして使用する

StackOverflow https://stackoverflow.com/questions/300697

  •  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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top