Created
September 28, 2012 16:43
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- -------------------------------------------------------------------------------- | |
-- 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