Использование переменных в качестве OFFSET в операторах SELECT внутри хранимых функций MySQL.

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, он работает нормально.

Может кто-нибудь пролить свет на эту тему, пожалуйста.

Я использую MySQL 5.0.45 в окне Windows.

Спасибо

Это было полезно?

Решение

В MySQL до версии 5.5 вы не можете поместить переменную в LIMIT в хранимых процедурах MySQL.Вам необходимо интерполировать его в строку, а затем выполнить строку как динамический запрос.

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