procedure que deve gerar uma concatenação de linhas
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
Discussão (2)
Carregando comentários...