Trabalhando com Cursores em MS-SQL Server.

Aprenda a trabalhar com cursores em MS-Sql Server


Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 21/08/2018

Quando estamos trabalhando com STORED PROCEDURES, muitas vezes temos a necessidade de fazer uma leitura e processar seus registros lendo linha a linha até o final da tabela. Vamos lá entender como podemos fazer esta operação em MS-Sql.

Para evitar erros quando estamos trabalhando com diversos cursores podemos executar a seguinte função para verificar se o cursor esta aberto e se sim executar o procedimento para fechar (CLOSE) e liberar a memoria (DEALLOCATE), conforme o exemplo abaixo:

IF (CURSOR_STATUS('global','curr')>=-1)
BEGIN
      CLOSE curr
      DEALLOCATE curr
END

O próximo passo é declarar nosso cursor

DECLARE curr
CURSOR FOR

Agora vamos carregar os dados e abrir nosso cursor, abaixo temos o exemplo de um SELECT, declarando as variaveis e carregando os dados no cursor com o comando FETCH:

-- Select
SELECT id, nome, idgrupo FROM tblclientes c  WHERE c.idgrupo > 0

-- Declarando as variáveis para carregar os dados 
DECLARE @id INT
DECLARE @nome VARCHAR(50)
DECLARE @idgrupo INT

-- Abrindo o Cursor
OPEN curr

-- Posiciona os dados do registro atribuindo as variáveis
FETCH NEXT FROM curr INTO @id, @nome, @idgrupo

em seguida faremos o LOOP de leitura de nosso de nossos dados utilizando o cursor:

-- While
WHILE @@FETCH_STATUS = 0
BEGIN
    
   -- faça o tratamento dos dados aqui....
      
   UPDATE tblclientes SET soma = soma + 1 WHERE  id = @id

   -- Movimenta o ponteiro dos dados para o próximo registro e carrega as variáveis 
   FETCH NEXT FROM curr INTO @id, @nome, @idgrupo

END

Após finalizarmos nosso LOOP de leitura e tratamento dos dados fechamos nosso cursor e liberamos a memoria:

CLOSE curr
DEALLOCATE curr


Nossa estrutura completa completa ficaria assim:
IF (CURSOR_STATUS('global','curr')>=-1)
BEGIN
      CLOSE curr
      DEALLOCATE curr
END

DECLARE curr
CURSOR FOR

-- Select
SELECT id, nome, idgrupo FROM tblclientes c
    WHERE c.idgrupo > 0

-- Declarando as variáveis para carregar os dados 
DECLARE @id INT
DECLARE @nome VARCHAR(50)
DECLARE @idgrupo INT

-- Abrindo o Cursor
OPEN curr

-- Posiciona os dados do registro atribuindo as variáveis
FETCH NEXT FROM curr INTO @id, @nome, @idgrupo

-- While
WHILE @@FETCH_STATUS = 0
BEGIN
    
   -- faça o tratamento dos dados aqui....
      
   UPDATE tblclientes SET soma = soma + 1 WHERE  id = @id

   -- Movimenta o ponteiro dos dados para o próximo registro e carrega as variáveis 
   FETCH NEXT FROM curr INTO @id, @nome, @idgrupo

END

-- Fechando nosso cursor
CLOSE curr
DEALLOCATE curr


Comentários