Skip to content

Instantly share code, notes, and snippets.

@konscia
Created September 28, 2012 16:43
Show Gist options
  • Save konscia/3800859 to your computer and use it in GitHub Desktop.
Save konscia/3800859 to your computer and use it in GitHub Desktop.
Padrão de Procedure para pré-calculo de dados com diversas combinações
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER ;;
CREATE PROCEDURE `padraoProcedurePreCalculo`()
BEGIN
DECLARE done INT DEFAULT FALSE;
-- Declara variáveis que receberão os atributos da tabela temporária
DECLARE _a1 INT;
DECLARE _a2 VARCHAR(20);
DECLARE _enabled VARCHAR(20);
-- Declara CURSOR para tabela temporária selecionando as variáveis que serão usadas
DECLARE opcoes CURSOR FOR select a1, a2, enabled from tabela_temporaria_com_combinacoes;
-- Declara manipulador para saber quando a tabela acabou.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Abre o cursor
OPEN opcoes;
-- Inicia o loop
loop_leitura: LOOP
-- Se terminaram os dados da tabela temporária, termina o loop
IF done THEN
LEAVE loop_leitura;
END IF;
-- Coloca os dados do cursor para as variáveis
FETCH opcoes INTO _a1, _a2, _enabled;
-- Na tabela temporária colocamos uma coluna para dizer se aquela linha está habilitada.
-- Isso é útil quando você quiser executar a procedure testando apenas linhas específicas
IF _enabled = 0 THEN
ITERATE loop_leitura;
END IF;
-- Escreve a query base,
-- colocando marcadores nos locais que devem ser substituídos pelas variáveis da tabela temporária
set @query = '
insert into tabela_final
select
NULL,
count(*),
sum( :a1 = 1)
from tabela as t
where :where_filter
group by :a2;
';
-- Substitui na query os marcadores pelas variáveis
set @query = REPLACE(@query, ':a1', _a1);
set @query = REPLACE(@query, ':a2', _a2);
-- Usa condicionais se a consulta tiver especificidades
if _a1 = 1 then
set @query = REPLACE(@query, ':where_filter', 'columnx = \'A\'');
else
set @query = REPLACE(@query, ':where_filter', 'columnx = \'B\'');
end if;
-- Guarda a tabela em uma consulta de log
insert into log (message) values (@query);
-- Executa a query construída
prepare stmt1 from @query;
EXECUTE stmt1;
-- fecha loop
END LOOP;
-- fecha cursor
CLOSE opcoes;
-- agora pode rodar e ir tomar um café enquanto os dados ficam prontos.
END;;
DELIMITER ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment