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.

3 comentários sobre “Cursores em MySql

  1. Além de que stored procedures são muito mais rápidas do que procedimentos via software, pelo fato de que são compiladas e armazenadas diretamente na base de dados. O complicado mesmo é debugar esse tipo de procedimento, pois pelo que conheço existem poucas ferramentas para isso.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *