Pergunta

Estou escrevendo um procedimento armazenado onde eu tenho um parâmetro de entrada chamada my_size que é uma INTEIRO . Eu quero ser capaz de usá-lo em uma cláusula LIMIT em um comunicado SELECT. Aparentemente, isso não é suportado, há uma maneira de contornar isso?

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

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

Solução

A pesquisa apareceu este artigo . Eu tenho colado o texto relevante abaixo.

Aqui está um post fórum mostrando um exemplo de declarações preparadas deixando você atribuir um valor variável para a cláusula limite:

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

No entanto, penso que este bug deve obter alguma atenção porque eu não posso imaginar que as declarações preparadas dentro de um procedimento permitirá que para qualquer otimizações-compilação em tempo procedimento. Tenho a sensação de que elaborou declarações são compilado e executado no tempo de execução do procedimento, probaby que tem um impacto negativo na eficiência. Se o limite cláusula poderia aceitar variáveis ??normais de procedimento (digamos, um procedimento argumento), então o banco de dados ainda poderia executar em tempo de compilação otimizações no resto da consulta, dentro do procedimento. este provavelmente deu execução mais rápida do procedimento. Não sou especialista embora.

Outras dicas

Para aqueles que não podem usar o MySQL 5.5.6+ e não quero escrever um procedimento armazenado, há uma outra variante. Podemos adicionar onde cláusula em uma subselect com ROWNUM.

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

procedimento armazenado

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 ;

Utilização

call get_users(1, 10);

Eu sei que esta resposta veio tarde, mas tente SQL_SELECT_LIMIT.

Exemplo:

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

Este recurso foi adicionado ao MySQL 5.5.6. Marque esta ligação fora.

Eu atualizado para MySQL 5.5 apenas para esse recurso e funciona muito bem. 5.5 também tem um monte de atualizações de desempenho no lugar e eu recomendo totalmente.

Outra forma, o mesmo que escreveu "Pradeep Sanjaya", mas 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 do MySQL versão 5.5.6, você pode especificar LIMIT e OFFSET com variáveis ??/ parâmetros.

Para referência, veja o 5.5 manual , 5,6 manual e de @ Quassnoi resposta

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top