Cursores em MySQL

Retornando nas “interwebs”, decidi reviver um post antigo mas que ainda me salva de muitas situações que acontecem enquanto desenvolvedor de sistemas. Publicado originalmente em http://esseconhece.com.br/cursores-em-mysql/

No desenvolvimento e manutenção de sistemas, é comum que apareçam algumas funcionalidades ou mudanças que impliquem em alterar a estrutura existente do banco de dados. Nos sistemas que já estão em produção, já não se pode mais eliminar a base de dados e iniciar novamente, pois não podemos deixar que os dados do cliente “desapareçam”.

Em muitas dessas modificações de estrutura do banco, é necessário “transferir” dados de determinadas tabelas para outras, ou fazer alguma operação para que a nova estrutura do banco de dados também se adapte ao sistema. Uma das formas para se efetuar esses ajustes é programando e executando scripts SQL.

Para tratar de uma coleção de dados(vinda de um select, por exemplo), nos utilizamos de cursores. Tive a necessidade de ajustar uma base de dados MySql, e tive de escrever uma rotina para se utilizar de duas tabelas e gerar dados para uma outra tabela. Achei um tanto burocrático, sem contar que nem o exemplo contido na documentação funcionou.

A fim de evitar que passem pelas mesmas dificuldades que passei, vou disponibilizar a estrutura com a qual tive sucesso.

 

delimiter ;
drop procedure if exists insereDados;

delimiter |

create procedure insereDados()
 begin

 DECLARE done INT DEFAULT 0;
 DECLARE var1, var2, var3 BIGINT;

 DECLARE curs CURSOR FOR (
	SELECT dado1, dado2, dado3 FROM TABELA
	);

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

 OPEN curs;

 REPEAT

 	FETCH curs INTO var1, var2, var3;
		IF NOT done THEN
			INSERT INTO OUTRA_TABELA(campo1, campo2, campo3) VALUES(var1, var2, var3);
		END IF;
 UNTIL done END REPEAT;

 CLOSE curs;

 end
|

delimiter ;

call insereDados();
drop procedure if exists insereDados;

Lembrando que a ordem de declaração de delimitadores, variáveis e cursores deve ser seguida rigorosamente. Vale lembrar também que estaremos criando uma procedure (que para funcionar deverá ser chamada), portanto ela ficará armazenada no banco, a menos que você exclua ela. Para resolver isto, aproveitei e criei mais duas linhas(as duas últimas) onde estou chamando a procedure criada e depois de sua execução estou eliminando-a.

Um post rápido que espero que sirva de ajuda para quem precisa fazer coisas mais “cabulosas” com o banco de dados MySql.

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s