2010-05-20 14 views
10

Ich erstelle eine Paging-Klasse und muss zwei Parameter an meine gespeicherte MySQL-Prozedur für die LIMIT-Klausel übergeben.Übergabe von LIMIT als Parameter an MySQL sproc

ich vorbei, sie als INTs in und versuchen, so etwas wie dieses

SELECT * 
FROM 
`MyTable` 
LIMIT 
MyFirstParamInt, MySecondParamInt 

es mir einen Fehler gibt, wenn ich versuche, und obwohl die sproc speichern. Gibt es eine Möglichkeit, dies zu tun, die ich gerade vermisse? Oder muss ich die gesamte Abfrage EVALIEREN und AUSFÜHREN?

Antwort

13

Vor 5.5.6 konnte LIMIT in gespeicherten MySQL-Prozeduren nicht parametrisiert werden. Sie müssten die Abfrage dynamisch erstellen und ausführen.

In 5.5.6 und höher können Sie einfach die gespeicherten Parameter proccs als Argumente an LIMIT und OFFSET übergeben, solange sie INTEGER sind.

+0

das war, wovor ich Angst hatte ... danke. – Kyle

+1

o rly? \t 9 mehr zu gehen .. –

+0

Dies ist nicht die richtige Antwort, die richtige ist, was @Eric_M beantwortet – Bergkamp

8

Von http://dev.mysql.com/doc/refman/5.1/en/select.html:

Die Klausel LIMIT kann verwendet werden, um die Anzahl der Zeilen, die von der SELECT-Anweisung zurück zu beschränken. LIMIT benötigt ein oder zwei numerische Argumente, , die beide nichtnegative ganzzahlige Konstanten sein müssen (außer bei Verwendung vorbereiteter Anweisungen).

Hier vorbereitete Anweisung Beispiel die Ihnen helfen könnten:

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

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

[Begrenzte ausgewählte Zeilen zählen mit einem gespeicherten Prozedurparameter in MySQL] (http://stackoverflow.com/questions/245180/variable-limit-clause-in-mysql) –

7

Ich fand nur eine Lösung, die hilfreich sein können. Verwenden Sie deklarierte Variablen in Ihrer gespeicherten Prozedur und setzen Sie sie auf Ihre Parameter

eg.

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 
+1

Dies funktionierte nicht für mich mit 5.1.71. Obwohl ich keine Probleme habe, Parameter mit Stored Procedures in 5.5.33a-MariaDB zu übergeben. –

-1

Paginierung ohne Aussagen:

create PROCEDURE test(
    IN first_rec integer, 
    IN rec_count integer 
) 
BEGIN 
    -- return -- 
    SET @rownum=0; 
    SELECT * FROM (
    SELECT 
    user.*, @rownum:[email protected]+1 AS rn FROM user 
) t WHERE rn>=first_rec and rn<first_rec+rec_count; 
END;; 
0

Die folgende arbeitete in MySQL 5.5.35 gut. Es funktionierte auch in einem anderen Verfahren, wo das gleiche SELECT innerhalb einer DECLARE . . . CURSOR Anweisung verwendet wurde.

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; 
-1

Einfache Lösung

CREATE PROCEDURE `some_proc` (
IN _START INTEGER, 
IN _LIMIT INTEGER 
) 
BEGIN 
PREPARE STMT FROM 
" SELECT * FROM products LIMIT ?,? "; 
SET @START = _START; 
SET @LIMIT = _LIMIT; 
EXECUTE STMT USING @START, @LIMIT; 
DEALLOCATE PREPARE STMT; 
END $$ 

Versuchen in gespeicherte Prozedur vorzubereiten Aussage.

Verwandte Themen