Использование переменных в качестве OFFSET в операторах SELECT внутри хранимых функций MySQL.
-
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;