Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ricardo Buzzo

procedure que deve gerar uma concatenação de linhas

Recommended Posts

Olá a todos,

 

Sou iniciante em MySQL e estou tentando montar uma consulta dinâmica (que deve variar a cada nova inserção de dados na tabela alun_aulas (em que aparece a data de aulas). Preciso de um relatório em que as ocorrências por aluno (registradas em outra tabela) apareçam em todas as aulas (as linhas com datas de aula na tabela alun_aulas deverão aparecer como colunas nessa consulta). Para isso, criei um select usando a função MAX(), que funciona direitinho, só que estaticamente. A cada nova inserção de aula, eu teria que modificar o SELECT para incluir uma nova linha MAX() -- cada linha MAX() gera uma coluna correspondente àquele dia de aula (os alunos aparecem nas linhas, e as ocorrências, uma terceira tabela, no corpo dessa visualização).

 

Por isso resolvi criar um procedure que gera as linhas MAX(), a ser chamado no SELECT que gera a visualização que eu quero. Por isso a diferenciação no código - a última linha não pode ter vírgula no final, as anteriores precisam disso, cada linha é um argumento do select. Mas o código retorna NULL. Alguém consegue encontrar o erro?

 

Desde já obrigado!

 

Ricardo.

 

 

CREATE DEFINER=`alunos`@`localhost` PROCEDURE `loop_max`()
BEGIN
-- DECLARAÇÃO DAS VARIÁVEIS UTILIZADAS DO PROCEDURE
-- VARIÁVEL CONTROLE
DECLARE done INT DEFAULT 0;
-- VARIÁVEL PARA APLICAR O CURSOR À STRING
DECLARE curA DATE;
-- VARIÁVEL PARA VERIFICAR O ÚLTIMO REGRISTRO DO CURSOR (A ÚLTIMA LINHA DA CONCATENAÇÃO NÃO DEVE TER VÍRGULA NO FINAL)
DECLARE FIM DATE;
-- VARIÁVEL PARA ARMAZENAR AS LINHAS GERADAS A CADA LAÇO
DECLARE LINHA TEXT DEFAULT NULL;
-- VARIÁVEL PARA ARMAZENAR O RESULTADO FINAL
DECLARE RESULTADO TEXT DEFAULT NULL;
-- CURSOR QUE RECONHE AS DATAS A SEREM UTILIZADAS
DECLARE A CURSOR FOR SELECT DATA_AULA FROM alun_aulas order by DATA_AULA asc;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- ARMAZENA NA VARIÁVEL FIM A MAIOR DATA DA SÉRIE QUE SERÁ INSERIDA NAS STRINGS
SET FIM=(select max(DATA_AULA) from alun_aulas order by alun_aulas.DATA_AULA);
-- ABRE O CURSOR
OPEN A;
-- INÍCIO DO LOOP
max_loop: loop
FETCH A INTO curA;
-- CONDIÇÃO QUE GERA AS LINHAS COM VÍRGULA NO FINAL
if curA < FIM then
SET LINHA = (select concat ('max( ( CASE DATA_ALUNO WHEN \'', curA, '\' THEN LC or FALTA ELSE null END)) AS \'', curA, '\', '));
IF RESULTADO = NULL THEN
SET RESULTADO = LINHA;
ELSE
SET RESULTADO = (SELECT CONCAT (RESULTADO, LINHA));
END IF;
-- CONDIÇÃO QUE GERA A ÚLTIMA LINHA
else
SET LINHA = (select concat ('max( ( CASE DATA_ALUNO WHEN \'', curA, '\' THEN LC or FALTA ELSE null END)) AS \'', curA, '\''));
IF RESULTADO = NULL THEN
SET RESULTADO = LINHA;
ELSE
SET RESULTADO = (SELECT CONCAT (RESULTADO, LINHA));
END IF;
END IF;
-- VARIÁVEL CONTROLE
if done =1 then
leave max_loop;
end if;
END loop max_loop;
-- RETORNA TODAS AS LINHAS CONCATENADAS
SELECT LINHA;
END

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa, rodei o script agora, e na verdade ele retornou apenas a última linha... parece que o meu uso de SET e CONCAT não está muito correto, aparentemente ele subscreve sempre o conteudo da variável... alguém saberia um jeito de acrescentar as linhas na variável, ao invés de mudar seu valor a cada SET (sem perder as linhas anteriormente inseridas na variável...)?



pessoal, desculpem-me pelo quase flood aqui, mas acabei de ver que minha ultima linha está errada. No script que que eu postei, estava SELECT LINHA, um teste que eu fiz para ver como essa variável terminava na função. O que eu preciso é da variável RESULTADO, que de fato retorna NULL. Obrigado, e mais uma vez pelo desculpas pelas confusões...

 

Grato,

 

Ricardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui! Era só mudar o valor padrão da variável RESULTADO para ' ' ao invés de NULL... agora tenho outro problema, porque o que eu queria fazer não deu certo... vou postar outro tópico sobre isso.

 

Espero que o código possa ser útil pra alguém

 

[ ]

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.