Data de Publicação: 12 de Janeiro de 2007
Cursor é um recurso bastante interessante em bancos de dados pois permite que seus códigos SQL façam uma varredura de uma tabela ou consulta linha-por-linha, realizando mais de uma operação se for o caso.
Na maioria das vezes, um simples SELECT exibe na tela esta varredura, trazendo todos os registros da consulta em questão. A vantagem de usar um cursor é quando, além da exibição dos dados, queremos realizar algumas operações sobre os registros. Se o volume de operações for grande, fica muito mais fácil, limpo e prático escrever o código utilizando cursor, do que uma consulta SQL.
Por exemplo: É muito mais vantajoso criar um cursor que faça a análise de cada produto de estoque, conferindo seu histórico, calculando sua previsão de vendas para o próximo mês, capturando o melhor cliente que já o comprou, etc, do que criar um SELECT absurdamente grande que talvez não consiga ainda todas as informações de forma simples.
Para utilizar um cursor, analise o código-fonte a seguir, onde são mostrados e comentados passo-a-passo a criação de um cursor e sua chamada. O objetivo do cursor apresentado a seguir é de somar a kilometragem atual de todos os veículos de um banco de dados fictício.
IMPORTANTE: O exemplo a seguir é meramente didático, seu resultado poderia ser obtido com um SELECT simples de soma (função SUM()).
Se desejar executar este código em seu MySQL, copie-o e cole-o em um arquivo do tipo '.sql', e execute-o no terminal desta forma: mysql> source <caminho do arquivo>;
CREATE DATABASE TUTORIAL_CURSOR;
USE TUTORIAL_CURSOR;
CREATE TABLE VEICULOS(
VEICULO varchar(32) NOT NULL,
KILOMETRAGEM int NOT NULL
);
INSERT INTO VEICULOS (VEICULO, KILOMETRAGEM) VALUES ('Carro 1', '5230');
INSERT INTO VEICULOS (VEICULO, KILOMETRAGEM) VALUES ('Carro 2', '7800');
INSERT INTO VEICULOS (VEICULO, KILOMETRAGEM) VALUES ('Carro 3', '16540');
INSERT INTO VEICULOS (VEICULO, KILOMETRAGEM) VALUES ('Carro 4', '32230');
DROP PROCEDURE IF EXISTS TUTORIAL_CURSOR.SomaKilometragem;
DELIMITER $$
CREATE PROCEDURE TUTORIAL_CURSOR.SomaKilometragem (OUT resultado INT)
BEGIN
-- Definição de variáveis utilizadas na Procedure
DECLARE existe_mais_linhas INT DEFAULT 0;
DECLARE kilometros INT DEFAULT 0;
DECLARE total_de_kilometros INT DEFAULT 0;
-- Definição do cursor
DECLARE meuCursor CURSOR FOR SELECT KILOMETRAGEM FROM VEICULOS;
-- Definição da variável de controle de looping do cursor
DECLARE CONTINUE HANDLER FOR NOT FOUND SET existe_mais_linhas=1;
-- Abertura do cursor
OPEN meuCursor;
-- Looping de execução do cursor
meuLoop: LOOP
FETCH meuCursor INTO kilometros;
-- Controle de existir mais registros na tabela
IF existe_mais_linhas = 1 THEN
LEAVE meuLoop;
END IF;
-- Soma a kilometragem do registro atual com o total acumulado
SET total_de_kilometros = total_de_kilometros + kilometros;
-- Retorna para a primeira linha do loop
END LOOP meuLoop;
-- Setando a variável com o resultado final
SET resultado = total_de_kilometros;
END $$
DELIMITER ;
CALL SomaKilometragem(@variavel_temporaria);
SELECT @variavel_temporaria;
O resultado final para este cursor é o seguinte:
+----------------------+ | @variavel_temporaria | +----------------------+ | 61800 | +----------------------+
André Milani é autor do livro MySQL - Guia do Programador, da editora Novatec, um livro que indica ao leitor todos os passos necessários para conhecer e utilizar esta ferramenta da melhor maneira possível, partindo do básico, para quem não teve ainda nenhum contato com o MySQL, até o nível avançado, servindo como um guia de referência para administradores, por meio de explicações claras e objetivas complementadas com exemplos práticos para cada situação de uso. Destinado a administradores de bancos de dados, programadores, estudantes e a todos que se interessam pelo assunto.
Para saber mais sobre o livro, acesse: http://www.novateceditora.com.br/livros/mysqlcompleto