2010-03-08 14 views
3

J'ai une procédure SelectProc qui contient l'instruction SELECT. Je veux ajouter une procédure LimitRowsCount et param utiliser comme suit:La limitation des lignes sélectionnées compte avec un paramètre de procédure stockée dans MySQL

CREATE PROCEDURE SelectProc (IN LimitRowsCount INTEGER UNSIGNED) 
BEGIN 
    SELECT (...) 
    LIMIT LimitRowsCount; 
END 

mais cette approche ne fonctionne pas. Le SELECT lui-même contient des sous-requêtes imbriquées, donc je ne peux pas créer de vue à partir de celui-ci. Y a-t-il un moyen plus propper que SQL dynamique (instructions préparées)?

Répondre

3
CREATE PROCEDURE SelectProc (IN LimitRowsCount INT) 
BEGIN 

SET @LimitRowsCount1=LimitRowsCount; 

PREPARE STMT FROM "SELECT (...) LIMIT ?"; 

EXECUTE STMT USING @LimitRowsCount1; 

END 
+0

http://forums.mysql.com/read.php?98,69465,78682 – Babar

2

A partir du manuel:

The LIMIT clause can be used to constrain the number of rows 
returned by the SELECT statement. LIMIT takes one or two numeric 
arguments, which must both be nonnegative integer constants 
(except when using prepared statements). 

MySQL Manual - 12.2.8. SELECT Syntax

donc c'est un pas - vous ne pouvez pas.

+0

Non, il n'y a pas de meilleure façon? Rien qui fonctionne comme LIMIT? – ssobczak

+0

Rien de plus simple que d'utiliser des instructions préparées. Vous pouvez sélectionner vos données dans une table temporaire, les couper pour les dimensionner et les sélectionner, mais c'est beaucoup plus compliqué que de simplement intégrer une clause limit dans une instruction préparée. Y a-t-il une raison particulière pour laquelle vous ne voulez pas utiliser des déclarations préparées? – Martin

+0

Je préfère ne pas utiliser de fonctions eval. Dans ce cas, je vais devoir le faire. Merci pour l'aide! – ssobczak