2010-05-20 51 views
10

Estoy creando una clase de búsqueda y necesito pasar dos parámetros a mi procedimiento almacenado MySQL para la cláusula LIMIT.pasando el LÍMITE como parámetros a la secuencia de comandos de MySQL

los estoy pasando como intercepciones y tratando algo como esto

SELECT * 
FROM 
`MyTable` 
LIMIT 
MyFirstParamInt, MySecondParamInt 

me da un error al tratar de salvar la sproc sin embargo. ¿Hay alguna manera de hacer esto que me estoy perdiendo? ¿O tendré que EVALUAR toda la consulta y EJECUTARLA?

Respuesta

13

Antes de 5.5.6, LIMIT no se pudo parametrizar en los procedimientos almacenados de MySQL. Necesitarías construir la consulta dinámicamente y ejecutarla.

En 5.5.6 y superior, puede pasar los parámetros de procs almacenados como argumentos a LIMIT y OFFSET, siempre que sean INTEGER.

+0

eso es lo que tenía miedo ... gracias. – Kyle

+1

o rly? \t 9 más por delante ... –

+0

Esta no es la respuesta correcta, la correcta es la respuesta de @Eric_M – Bergkamp

8

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

La cláusula LIMIT puede usarse para limitar el número de filas devueltas por la instrucción SELECT. LIMIT toma uno o dos argumentos numéricos, que deben ser constantes enteras no negativas (excepto cuando se utilizan declaraciones preparadas).

Aquí es ejemplo declaración preparada que podría ayudarle a:

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

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

[Limitar las filas seleccionadas a contar con un parámetro de procedimiento almacenado en MySQL] (http://stackoverflow.com/questions/245180/variable-limit-clause-in-mysql) –

7

que acaba de encontrar una solución que puede ser útil. Utilice las variables declaradas en su procedimiento almacenado y configúrelas en sus parámetros

por ejemplo.

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

Esto no funcionó para mí usando 5.1.71. Aunque no tengo problemas para pasar parámetros usando los procedimientos almacenados en 5.5.33a-MariaDB. –

-1

paginación sin declaraciones:

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

El siguiente funcionaba bien en MySQL 5.5.35. También funcionó en otro procedimiento donde se usó el mismo SELECT dentro de una declaración 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

solución simple

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

Intenta preparar la declaración de procedimiento almacenado.

Cuestiones relacionadas