Pregunta

Estoy escribiendo un procedimiento almacenado en el que tengo un parámetro de entrada llamado my_size que es un INTEGER . Quiero poder usarlo en una cláusula LIMIT en una declaración SELECT . Aparentemente esto no es compatible, ¿hay alguna forma de solucionar esto?

# I want something like:
SELECT * FROM some_table LIMIT my_size;

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
¿Fue útil?

Solución

Se produjo una búsqueda este artículo . He pegado el texto relevante a continuación.

  

Aquí hay una publicación en el foro que muestra un ejemplo de declaraciones preparadas que permiten   asigna un valor variable a la cláusula límite:

     

http://forums.mysql.com/read. php? 98,126379,133966 # msg-133966

     

Sin embargo, creo que este error debería recibir algo de atención porque no puedo   Imagine que las declaraciones preparadas dentro de un procedimiento permitirán cualquier   Optimizaciones en tiempo de compilación de procedimientos. Tengo la sensación de que me preparé   Las declaraciones se compilan y ejecutan en el tiempo de ejecución del procedimiento,   Qué probaby tiene un impacto negativo en la eficiencia. Si el limite   cláusula podría aceptar variables de procedimiento normal (por ejemplo, un procedimiento   argumento), entonces la base de datos todavía podría realizar tiempo de compilación   Optimizaciones sobre el resto de la consulta, dentro del procedimiento. Esta   Probablemente se produciría una ejecución más rápida del procedimiento. No soy un experto   aunque.

Otros consejos

Para aquellos que no pueden usar MySQL 5.5.6+ y no desean escribir un procedimiento almacenado, hay otra variante. Podemos agregar la cláusula where en una subselección con ROWNUM.

SET @limit = 10;
SELECT * FROM (
  SELECT instances.*, 
         @rownum := @rownum + 1 AS rank
    FROM instances, 
         (SELECT @rownum := 0) r
) d WHERE rank < @limit;

PROCEDIMIENTO ALMACENADO

DELIMITER $
create PROCEDURE get_users(page_from INT, page_size INT)
begin
SET @_page_from = page_from;
SET @_page_size = page_size;
PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;";
EXECUTE stmt USING @_page_from, @_page_size;
DEALLOCATE PREPARE stmt;
end$
DELIMITER ;

USAGE

call get_users(1, 10);

Sé que esta respuesta llegó tarde, pero intente con SQL_SELECT_LIMIT.

Ejemplo:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;

Esta característica se ha agregado a MySQL 5.5.6. Consulte este enlace hacia fuera.

He actualizado a MySQL 5.5 solo para esta característica y funciona muy bien. 5.5 también tiene muchas mejoras de rendimiento y lo recomiendo totalmente.

Otra forma, la misma que escribí "Pradeep Sanjaya", pero usando CONCAT:

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT)
READS SQL DATA
  COMMENT 'example'
BEGIN
  SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum);
  PREPARE zxc FROM @asd;
  EXECUTE zxc;
END;

A partir de la versión 5.5.6 de MySQL, puede especificar LIMIT y OFFSET con variables / parámetros.

Para referencia, consulte 5.5 Manual , el 5.6 Manual y @ Quassnoi's answer

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top