Usar variables como OFFSET en las instrucciones SELECT dentro de las funciones almacenadas de mysql

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

  •  08-07-2019
  •  | 
  •  

Pregunta

Soy bastante nuevo en el tema de escribir funciones almacenadas para la base de datos mySQL, por lo tanto, no estoy seguro de si lo que estoy tratando de hacer aquí es posible.

Necesito una función que devuelva una columna de una fila aleatoria de una tabla. No quiero usar el método ORDER BY RAND () para hacer eso, más bien lo haría así:

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 arroja un error al crear una función con un cuerpo como ese. Pero cuando uso un número codificado como OFFSET funciona bien.

¿Alguien puede arrojar algo de luz sobre el tema, por favor.

Estoy ejecutando MySQL 5.0.45 en Windows Box.

Gracias

¿Fue útil?

Solución

En MySQL antes de 5.5, no puede colocar una variable en la cláusula LIMIT en los procedimientos almacenados de MySQL. Debe interpolarlo en una cadena y luego ejecutar la cadena como una consulta dinámica.

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top