Domanda

Sto scrivendo una procedura memorizzata in cui ho un parametro di input chiamato my_size che è un INTEGER . Voglio essere in grado di usarlo in una clausola LIMIT in un'istruzione SELECT . Apparentemente questo non è supportato, c'è un modo per aggirare questo?

# I want something like:
SELECT * FROM some_table LIMIT my_size;

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
È stato utile?

Soluzione

È stata trovata una ricerca questo articolo . Ho incollato il testo pertinente di seguito.

  

Ecco un post sul forum che mostra un esempio di dichiarazioni preparate   si assegna un valore variabile alla clausola limite:

     

http://forums.mysql.com/read. php? 98,126379,133966 # msg-133.966

     

Tuttavia, penso che questo errore dovrebbe attirare l'attenzione perché non posso   immagina che le dichiarazioni preparate all'interno di una procedura consentano qualsiasi   ottimizzazioni in fase di compilazione delle procedure. Ho la sensazione che preparato   le istruzioni vengono compilate ed eseguite durante l'esecuzione della procedura,   quale probaby ha un impatto negativo sull'efficienza. Se il limite   la clausola potrebbe accettare le normali variabili di procedura (diciamo, una procedura   argomento), quindi il database potrebbe ancora eseguire il tempo di compilazione   ottimizzazioni sul resto della query, all'interno della procedura. Questo   produrrebbe probabilmente un'esecuzione più rapida della procedura. Non sono un esperto   però.

Altri suggerimenti

Per coloro che non possono usare MySQL 5.5.6+ e non vogliono scrivere una procedura memorizzata, esiste un'altra variante. Possiamo aggiungere la clausola where su una sottoselezione con ROWNUM.

SET @limit = 10;
SELECT * FROM (
  SELECT instances.*, 
         @rownum := @rownum + 1 AS rank
    FROM instances, 
         (SELECT @rownum := 0) r
) d WHERE rank < @limit;

PROCEDURA MEMORIZZATA

DELIMITER $
create PROCEDURE get_users(page_from INT, page_size INT)
begin
SET @_page_from = page_from;
SET @_page_size = page_size;
PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;";
EXECUTE stmt USING @_page_from, @_page_size;
DEALLOCATE PREPARE stmt;
end$
DELIMITER ;

Utilizzo

call get_users(1, 10);

So che questa risposta è arrivata in ritardo, ma prova SQL_SELECT_LIMIT.

Esempio:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;

Questa funzione è stata aggiunta a MySQL 5.5.6. Dai un'occhiata a questo link .

Ho eseguito l'aggiornamento a MySQL 5.5 solo per questa funzione e funziona benissimo. 5.5 ha anche molti aggiornamenti delle prestazioni in atto e lo consiglio vivamente.

Un altro modo, lo stesso di quello scritto "Pradeep Sanjaya", ma usando CONCAT:

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT)
READS SQL DATA
  COMMENT 'example'
BEGIN
  SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum);
  PREPARE zxc FROM @asd;
  EXECUTE zxc;
END;

A partire dalla versione 5.5.6 di MySQL, puoi specificare LIMIT e OFFSET con variabili / parametri.

Per riferimento, consultare il Manuale 5.5 , il 5.6 Manual e @ Quassnoi's rispondere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top