2010-05-20 16 views
10

Sto creando una classe di paging e ho bisogno di passare due parametri alla mia stored procedure MySQL per la clausola LIMIT.passaggio LIMIT come parametri a MySQL sproc

io li sto passando come INT e cercando qualcosa di simile

SELECT * 
FROM 
`MyTable` 
LIMIT 
MyFirstParamInt, MySecondParamInt 

mi dà un errore quando provo e risparmio lo sProc però. C'è un modo per farlo che mi manca? O ho intenzione di EVAL l'intera query e l'ESEGUI?

risposta

13

Prima di 5.5.6, LIMIT non può essere parametrizzato nelle procedure memorizzate MySQL. Dovresti creare la query in modo dinamico ed eseguirla.

In 5.5.6 e, soprattutto, si può solo passare i parametri stored procedure come argomenti per LIMIT e OFFSET fintanto che sono INTEGER.

+0

questo è quello che temevo ... grazie. – Kyle

+1

o rly? \t 9 altro per andare .. –

+0

Questa non è la risposta corretta, quella corretta è la risposta di @Eric_M – Bergkamp

8

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

La clausola LIMIT può essere utilizzato per limitare il numero di righe restituite dall'istruzione SELECT. LIMIT accetta uno o due argomenti numerici, , che devono essere entrambe costanti non negative di tipo (tranne quando si utilizzano istruzioni preparate).

Ecco esempio dichiarazione preparata che potrebbe aiutare:

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

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

[La limitazione delle righe selezionate conta con un parametro stored procedure in MySQL] (http://stackoverflow.com/questions/245180/variable-limit-clause-in-mysql) –

7

Ho appena trovato una soluzione che può essere utile. Usa le variabili dichiarate nella procedura memorizzata e impostale sui tuoi parametri

es.

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

Questo non ha funzionato con me utilizzando 5.1.71. Sebbene non abbia problemi nel passare i parametri usando Stored Procedures in 5.5.33a-MariaDB. –

-1

impaginazione senza dichiarazioni:

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

Di seguito ha lavorato bene in MySQL 5.5.35. Ha funzionato anche in un'altra procedura in cui è stato utilizzato lo stesso SELECT all'interno di una dichiarazione DECLARE . . . CURSOR.

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

Soluzione semplice

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 $$ 

Prova preparare istruzione nella stored procedure.