11
votes

Passage limite comme paramètres à MySQL SproC

Je crée une classe de pagination et je dois transmettre deux paramètres à ma procédure stockée MySQL pour la clause de limite.

Je les transmettes en tant qu'OB et essaye quelque chose comme ça P>

SELECT *
FROM
`MyTable`
LIMIT
MyFirstParamInt, MySecondParamInt


0 commentaires

7 Réponses :


16
votes

avant 5,5,6, limite n'a pas pu être paramétré dans les procédures stockées MySQL. Vous auriez besoin de construire la requête de manière dynamique et de l'exécuter.

en 5.5.6 et au-dessus, vous pouvez simplement transmettre les paramètres Procs stockés en tant qu'arguments sur Limiter et décalage tant qu'ils sont entier .


4 commentaires

Ce n'est pas la bonne réponse, la bonne est la réponse @eric_m


@Bergkamp: sa réponse ne fonctionnera pas sur la version de MySQL disponible au moment où cette réponse avait été donnée.


@Quassnoi, donc la réponse devrait changer, non?


dev.mysql.com/doc/refman/8.0/fr/Select. HTML "dans les programmes stockés, les paramètres de limite peuvent être spécifiés à l'aide de paramètres de routine entier et de variables locales."



10
votes

de http://dev.mysql.com/doc/refman /5.1/fr/select.html :

La clause de limite peut être utilisée pour contraindre le nombre de lignes renvoyées par l'instruction SELECT. La limite prend une ou deux arguments numériques, qui doit être des constantes entières non négatives fortes> (sauf lors de l'utilisation de déclarations préparées). P> blockquote>

Voici un exemple de déclaration préparé qui pourrait vous aider: P>

SET @skip=1;
SET @rows=5;

PREPARE STMT FROM 'SELECT * FROM table LIMIT ?, ?';
EXECUTE STMT USING @skip, @rows;



16
votes

Je viens de trouver une solution qui peut être utile. Utilisez des variables déclarées dans votre procédure stockée et définissez-les sur vos paramètres

EG. P>

 CREATE PROCEDURE MyProcedure(
   IN paramFrom INT,
   IN paramTo INT
  )
   BEGIN
       DECLARE valFrom INT;
       DECLARE valTo   INT;

       SET valFrom = paramFrom;
       SET valTo = paramTo;

       SELECT * FROM myTable LIMIT valFrom, valTo;
    END


2 commentaires

Cela n'a pas fonctionné pour moi en utilisant 5.1.71. Bien que je n'ai aucun problème à adopter des paramètres à l'aide de procédures stockées dans 5.5.33A-MARIADB.


Un embout rapide pour tous lire ces commentaires. Assurez-vous simplement d'ajouter votre clause limite à la fin de votre requête, pour éviter les erreurs.



0
votes

pagination sans instructions: xxx


0 commentaires

1
votes

Ce qui suit a fonctionné simplement bien dans MySQL 5.5.35. Il a également fonctionné dans une autre procédure dans laquelle le même sélectionner code> a été utilisé dans un déclarer. . . Curseur code> instruction.

CREATE PROCEDURE `test`(
  IN `lim_val` INT,
  IN `lim_offset` INT
)
BEGIN
  SELECT array_ident_id
    FROM ArrayIdents
    ORDER BY array_ident_id
    LIMIT lim_val OFFSET lim_offset;
END;


0 commentaires

-1
votes

Solution simple xxx

essayez de préparer la déclaration dans la procédure stockée.


0 commentaires

0
votes

Meilleur exemple de pagination peut vous aider

appel user_list code> (v_private_key, v_user_id, v_pageindex, v_limit, v_image_path, @O_Rec_Count, @O_ERROR_CODE, @O_ERROR_MESSAGE) P>

DECLARE count1 INT;
DECLARE total_pages INT;

SET count1  = in_count;
IF( count1 > 0 ) THEN 
    SET total_pages = CEIL(count1/in_limit);
ELSE 
    SET total_pages = 0;
END IF;

IF (in_page > total_pages) THEN 
SET in_page=total_pages;

END IF;
SET out_start_limit = in_limit * in_page - in_limit; 


0 commentaires