Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda para montar query dinâmica


aloysiocoutinho

Pergunta

Olá pessoALL,

 

Estou com dificuldades para montar uma query dinâmica. Será que vocês poderiam me ajudar?

É o seguinte:

 

Estou armazenando em uma variável o nome de uma tabela que consigo extrair de uma query:

 

query1.png

 

 Agora quero criar uma outra variável que conterá a composição de uma nova query que irá utilizar esta variável no nome da tabela (vide segunda linha da montagem):

E, por fim, gostaria de executar esta query que, teoricamente, está contida na variável @query (vide terceira linha da montagem, que por sinal está acusando um erro):

Mas, não está funcionando conforme eu esperava.
Se dou um "select @query" após a montagem, o seu conteúdo é o número zero "0".  :(
Futuramente esta composição irá virar uma procedure baseada em um cursor que irá extrair múltiplos "table_id", mas no momento estou tentando resolver esta montagem inicial primeiro.

 

Alguém pode me ajudar

 

Editado por aloysiocoutinho
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

O problema inicial foi resolvido.
Estava montando a estrutura baseado em MSSQL. Trocando os "+" por "," na função de "CONCAT" a montagem passou a funcionar:

query2.png

Agora que preciso da ajuda dos experts no assunto:

Quero montar uma procedure em loop que leia uma lista de "table_id" de uma outra tabela e me disponibilize esta contagem de todas as tabelas que existirem.
Percebam que na quey acima eu fixei o valor desta coluna (139). Agora quero fazer esta mesma montagem para múltiplos valores.

Estou tentando montar esta procedure da seguinte forma, mas ainda não obtive sucesso.

DROP PROCEDURE IF EXISTS purgeTable;
DELIMITER ;;

CREATE PROCEDURE purgeTable(INOUT query VARCHAR(10000))
BEGIN
    DECLARE done BOOLEAN DEFAULT FALSE;
    DECLARE table_id INT;
    DECLARE r_table VARCHAR(100);
    DECLARE table_id_cursor CURSOR FOR SELECT table_id FROM s_qos_data;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN table_id_cursor;

    read_loop: LOOP

    FETCH table_id_cursor INTO table_id;

        IF done THEN
            LEAVE read_loop;
        END IF;

        SET @r_table = (SELECT r_table FROM S_QOS_DATA WHERE table_id = @table_id);
        SET @query = CONCAT('SELECT COUNT(*) AS ', @r_table, ' FROM ', @r_table, ' sampletime < "2016-09-30 00:00:00" ');
        PREPARE stmt FROM @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

    END LOOP read_loop;
    CLOSE table_id_cursor;
END;;
DELIMITER ;
SET @query_list = '';
CALL purgeTable(@query_list);
SELECT @query_list;

Não sei  porquê a variável "table_id", que recebe o valor do resultado do select do cursor, está vindo NULL. sad.png

Alguém consegue me ajudar?

Link para o comentário
Compartilhar em outros sites

  • 0

Remova os @ de dentro da procedure para todas as variáveis declaradas dentro da procedure.

Exemplo:

Você declarou

 declare table_id int;

Então deve tratar

select r_table from S_QOS_DATA where table_id = @table_id

como 

select r_table from S_QOS_DATA where table_id = table_id

Eu uso um padrão para evitar conflito entre nomes de variáveis e campos dentro da procedure. Toda variável é declarada com um "p" de procedure na frente do nome da variável. Assim, a declaração seria

 declare ptable_id int;

e o uso:

select r_table from S_QOS_DATA where table_id = ptable_id

Tratamento para o parâmetro query quando no uso de um comando prepare:

Transfira o conteúdo de query para uma variável pública :

SET @ppquery = query;
prepare stmt from @ppquery;
EXECUTE stmt;
deallocate prepare stmt;

@ppquery não deve ser declarada dentro da procedure. Ela tem visão pública e o comando prepare não aceita variáveis private.

Link para o comentário
Compartilhar em outros sites

  • 0
8 horas atrás, Denis Courcy disse:

Remova os @ de dentro da procedure para todas as variáveis declaradas dentro da procedure.

Exemplo:

Você declarou


 declare table_id int;

Então deve tratar


select r_table from S_QOS_DATA where table_id = @table_id

como 


select r_table from S_QOS_DATA where table_id = table_id

Eu uso um padrão para evitar conflito entre nomes de variáveis e campos dentro da procedure. Toda variável é declarada com um "p" de procedure na frente do nome da variável. Assim, a declaração seria


 declare ptable_id int;

e o uso:


select r_table from S_QOS_DATA where table_id = ptable_id

Tratamento para o parâmetro query quando no uso de um comando prepare:

Transfira o conteúdo de query para uma variável pública :


SET @ppquery = query;
prepare stmt from @ppquery;
EXECUTE stmt;
deallocate prepare stmt;

@ppquery não deve ser declarada dentro da procedure. Ela tem visão pública e o comando prepare não aceita variáveis private.

Olá Denis,

O problema do table_id foi resolvido. Obrigado pela dica de quando usar ou não o @. Ainda sou novo na exploração do MySql.
Mas, não consegui montar o esquema da variável fora da procedure. Se uso simplesmente um declare fora do begin, recebo um erro. Não consigo encontrar uma explicação.
Seria algum tipo de declaração diferente para isso?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...