2008-11-19 5 views
4

Я довольно новичок в вопросе написания хранимой функции для базы данных mySQL, поэтому я не уверен, что то, что я пытаюсь сделать здесь, возможно вообще.Использование переменных как OFFSET в статусах SELECT в хранимых функциях 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 выдает ошибку при создании функции с телом, как это. Но когда я использую hard-code число как OFFSET, он работает нормально.

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

Я запускаю MySQL 5.0.45 на окне окна.

Благодаря

+0

Можете ли вы объяснить, почему «я не хочу использовать метод ORDER BY RAND() для этого»? – 2008-11-19 00:58:19

+0

Поскольку метод ORDER BY RAND() ужасен для производительности. Обратите внимание, что он имеет 120 000 строк в своем столе. – 2008-11-19 01:07:36

ответ

2

В 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^