Utiliser des variables comme OFFSET dans les instructions SELECT dans les fonctions stockées de mysql

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

  •  08-07-2019
  •  | 
  •  

Question

Je suis assez nouveau pour pouvoir écrire des fonctions stockées dans la base de données MySQL. Par conséquent, je ne suis pas sûr que ce que j'essaie de faire ici soit possible.

J'ai besoin d'une fonction qui renvoie une colonne d'une ligne aléatoire d'une table. Je ne veux pas utiliser la méthode ORDER BY RAND () pour le faire, mais plutôt comme ceci:

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 génère une erreur lors de la création d’une fonction avec un corps comme celui-là. Mais quand j'utilise un numéro codé en dur comme OFFSET, cela fonctionne très bien.

Quelqu'un peut-il apporter des éclaircissements sur le sujet s'il vous plaît.

J'utilise MySQL 5.0.45 sur Windows Box.

Merci

Était-ce utile?

La solution

Dans MySQL antérieur à 5.5, vous ne pouvez pas insérer de variable dans la clause LIMIT dans les procédures stockées MySQL. Vous devez l'interpoler dans une chaîne, puis l'exécuter en tant que requête dynamique.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top