Question

J'écris une procédure stockée dans laquelle j'ai un paramètre d'entrée appelé my_size qui est un INTEGER . Je veux pouvoir l'utiliser dans une clause LIMIT dans une instruction SELECT . Apparemment, cela n’est pas supporté. Y at-il un moyen de contourner ce problème?

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

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
Était-ce utile?

La solution

Une recherche a révélé cet article . J'ai collé le texte pertinent ci-dessous.

  

Voici un article de forum montrant un exemple de déclarations préparées laissant   vous affectez une valeur de variable à la clause limit:

     

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

     

Cependant, je pense que ce bug devrait attirer l'attention car je ne peux pas   imaginez que les déclarations préparées au cours d’une procédure permettent   optimisations au moment de la compilation des procédures. J'ai un sentiment que préparé   les instructions sont compilées et exécutées à l'exécution de la procédure,   qui probaby a un impact négatif sur l'efficacité. Si la limite   La clause peut accepter des variables de procédure normales (par exemple, une procédure   argument), la base de données peut toujours effectuer la compilation   optimisations sur le reste de la requête, au sein de la procédure. Ce   probablement permettre une exécution plus rapide de la procédure. Je ne suis pas un expert   bien que.

Autres conseils

Pour ceux qui ne peuvent pas utiliser MySQL 5.5.6+ et ne veulent pas écrire de procédure stockée, il existe une autre variante. Nous pouvons ajouter la clause where sur une sous-sélection avec ROWNUM.

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

PROCÉDURE STOCKÉE

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 ;

USAGE

call get_users(1, 10);

Je sais que cette réponse est arrivée en retard, mais essayez SQL_SELECT_LIMIT.

Exemple:

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

Cette fonctionnalité a été ajoutée à MySQL 5.5.6. Consultez ce lien sur.

Je suis passé à MySQL 5.5 uniquement pour cette fonctionnalité et fonctionne très bien. La version 5.5 dispose également de nombreuses améliorations de performances et je le recommande tout à fait.

Une autre façon, identique à celle écrite "Pradeep Sanjaya", mais en utilisant 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 partir de la version 5.5.6 de MySQL, vous pouvez spécifier LIMIT et OFFSET avec des variables / paramètres.

Pour référence, consultez le Manuel 5.5. , le Manuel 5.6 et @ Quassnoi's réponse

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top