Uso delle variabili come OFFSET nelle istruzioni SELECT all'interno delle funzioni memorizzate di mysql

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

  •  08-07-2019
  •  | 
  •  

Domanda

Sono abbastanza nuovo sull'argomento della scrittura della funzione memorizzata per il database mySQL, quindi non sono sicuro che ciò che sto cercando di fare qui sia possibile.

Ho bisogno di una funzione che restituirà una colonna da una riga casuale da una tabella. Non voglio usare il metodo ORDER BY RAND () per farlo, piuttosto lo farei così:

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 genera un errore durante la creazione di una funzione con un corpo del genere. Ma quando uso il numero hard-coded come OFFSET funziona perfettamente.

Qualcuno può far luce sull'argomento per favore.

Sto eseguendo MySQL 5.0.45 su Windows Box.

Grazie

È stato utile?

Soluzione

In MySQL prima della 5.5, non è possibile inserire una variabile nella clausola LIMIT nelle procedure memorizzate di MySQL. Devi interpolarlo in una stringa e quindi eseguire la stringa come una query dinamica.

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top