VAGAS DE EMPREGO

balta.io balta.io
  • Cursos
  • Carreiras
  • Para sua Empresa
  • Livros
    • Background Services
    • Blazor com .NET 8
    • Segurança em APIs
    • Futuro do C# 12
    • Nullable Types
    • Clean Code
  • Blog

Seja Premium
balta.io

  • Cursos
  • Carreiras
  • Para sua Empresa
  • Agenda
  • Livros
    • Background Services
    • Blazor com .NET 8
    • Segurança em APIs
    • Futuro do C# 12
    • Nullable Types
    • Clean Code
  • Blog
  • Player
Seja Premium

Entre ou Cadastre-se

  • Home
  • Artigos
  • SQL Server: Conhecendo os cursores


👉 Temos uma versão mais atualizada deste artigo no nosso novo Blog

SQL Server: Conhecendo os cursores

Sumário

  1. Introdução
  2. Declarando as variáveis
  3. Percorrendo os registros
  4. Manipulando os registros
  5. Finalização e verificação
  6. Conclusão
  7. Referências

Introdução

Cursores são estruturas de uma consulta onde podemos executar ações enquanto percorremos os registros. Neste artigo iremos montar um cursor com o objetivo de atualizar a cidadania de pessoas em uma tabela concatenando o campo Citizenship e UF.

square-horizontal-list

Como os dois campos são referentes à cidadania da pessoa, dentro no "nosso negócio" o campo UF é visto como dispensável e antes de excluir precisamos fazer esta concatenação.

Declarando as variáveis

Então começamos declarando nossa transação como ROLLBACK para evitar que qualquer execução durante o processo de desenvolvimento seja persistida no banco (não queremos registrar valores errados, não é mesmo?). Logo em seguida declaramos as variáveis que utilizaremos.

O id será utilizado como referência ao registro na hora de manipular, As variáveis personCitizenship e personUf armazenarão os valores de cidadania e UF respectivamente.

BEGIN TRANSACTION

    DECLARE
        @id UNIQUEIDENTIFIER,
        @personCitizenship NVARCHAR(120),
        @personUF NVARCHAR(120)

ROLLBACK

Percorrendo os registros

Agora iremos declarar o cursor e atribuir os campos necessários para nossas modificações através de uma consulta ou SELECT

BEGIN TRANSACTION

    DECLARE
        @id UNIQUEIDENTIFIER,
        @personCitizenship NVARCHAR(120),
        @personUF NVARCHAR(120)

    -- 01. Percorrer os registros
    DECLARE [cur_Person_CitizenshipUF] CURSOR FOR
        SELECT
            [Id],
            [Citizenship],
            [UF]
        FROM
            [Person]

ROLLBACK

Manipulando os registros

No passo 02 estamos abrindo nosso cursor e logo em seguida no passo 03 estamos lendo a próxima linha e associando as variáveis aos valores.

Logo em seguida no passo 04 declaramos nosso loop (laço) onde a linha de registro atual será atualizada com os valores das variáveis (passo 05) especificando o Id para que não modifiquemos todos os registros ao mesmo tempo.

Finalizando temos o passo 06 que lê o próximo registro e atualiza os valores das variáveis, fazendo o loop recomeçar enquanto houver registros na tabela.

O Passo 07 fecha o nosso cursor encerrando nossas modificações.

BEGIN TRANSACTION

    DECLARE
        @id UNIQUEIDENTIFIER,
        @personCitizenship NVARCHAR(120),
        @personUF NVARCHAR(120)

    -- 01. Percorrer os registros
    DECLARE [cur_Person_CitizenshipUF] CURSOR FOR
        SELECT
            [Id],
            [Citizenship],
            [UF]
        FROM
            [Person]

    -- 02. Abrir cursor
    OPEN [cur_Person_CitizenshipUF]

    -- 03. Percorrer próxima linha
    FETCH NEXT FROM
        [cur_Person_CitizenshipUF]
    INTO
        @id,
        @personCitizenship,
        @personUF

    -- 04. Percorrer linhas do cursor
    WHILE @@FETCH_STATUS = 0
    BEGIN

        -- 05. Executar rotinas no registro
        UPDATE [Person]
            SET [Citizenship] = @personCitizenship + '/' + @personUF
        WHERE
            [Id] = @id
        
        -- 06. Ler o próximo registro
        FETCH NEXT FROM [cur_Person_CitizenshipUF] INTO @id, @personCitizenship, @personUF
    END

    -- 07. Encerrar leitura do cursor
    CLOSE [cur_Person_CitizenshipUF]
ROLLBACK

Nota 1: A variável @FETCH_STATUS que está recebendo o valor 0 (zero) é uma função do tipo inteiro pré-existênte no SQL Server que retornar o estado do nosso FETCH do nosso cursor. Ou seja, enquanto houver registros atendendo às especificações, ele terá seu valor como 0 (zero). Ao chegar no fim dos registros ele modifica o valor para 1 (um).

Finalização e verificação

Agora precisamos remover a referência ao nosso cursor criada na memória. Do contrário estaremos ocupando este recurso sem necessidade. Para isto vamos seguir conforme o passo 08:

BEGIN TRANSACTION

    DECLARE
        @id UNIQUEIDENTIFIER,
        @personCitizenship NVARCHAR(120),
        @personUF NVARCHAR(120)

    -- 01. Percorrer os registros
    DECLARE [cur_Person_CitizenshipUF] CURSOR FOR
        SELECT
            [Id],
            [Citizenship],
            [UF]
        FROM
            [Person]

    -- 02. Abrir cursor
    OPEN [cur_Person_CitizenshipUF]

    -- 03. Percorrer próxima linha
    FETCH NEXT FROM
        [cur_Person_CitizenshipUF]
    INTO
        @id,
        @personCitizenship,
        @personUF

    -- 04. Percorrer linhas do cursor
    WHILE @@FETCH_STATUS = 0
    BEGIN

        -- 05. Executar rotinas no registro
        UPDATE [Person]
            SET [Citizenship] = @personCitizenship + '/' + @personUF
        WHERE
            [Id] = @id
        
        -- 06. Ler o próximo registro
        FETCH NEXT FROM [cur_Person_CitizenshipUF] INTO @id, @personCitizenship, @personUF
    END

    -- 07. Encerrar leitura do cursor
    CLOSE [cur_Person_CitizenshipUF]

    -- Finalizado o cursor
    DEALLOCATE [cur_Person_CitizenshipUF]
ROLLBACK

Com tudo concluído nós podemos então executar ainda com rollback e fazer um SELECT na nossa tabela para verificar se as modificações ocorreram como planejado.

SELECT
    [Id],
    [Citizenship],
    [UF]
FROM [Person]

Os valores resultantes devem ser semelhantes a os valores abaixo:

end-table-state

E agora que confirmamos que o código é executado corretamente podemos substituir o ROLLBACK por COMMIT na nossa transação para persistir as informações quando executarmos novamente o script. E finalizando podemos excluir a coluna UF:

ALTER TABLE [Person]
    DROP COLUMN [UF]
GO

Conclusão

Agora que você conhece como funciona a estrutura básica de um cursor poderá exercitar criando diversas rotinas referentes ao seu projeto, você também pode adicionar estes cursos em stored procedures.

Referências

Declare cursor - Documentação da Microsoft

@@FETCH_STATUS - Documentação da Microsoft

DEALLOCATE - Documentação da Microsoft

Populares

Priority Queue

Priority Queue ou fila prioritária é um tipo de lista inclusa no C# 10 que permite que seus itens...


Implicit Operators no C#

Implicit Operators permitem adicionar comportamentos de conversão a objetos Built In ou complexos...


ASP.NET 5 – Autenticação e Autorização com Bearer e JWT

Este artigo atualmente utiliza a versão 5.0.0-rc.1 do ASP.NET/.NET, o que significa que ainda não...


Clean Code - Guia e Exemplos

Saiba como manter seu código limpo (Clean Code) seguindo algumas práticas sugeridas pelo Robert C...


Git e GitHub - Instalação, Configuração e Primeiros Passos

Git é um sistema de controle de versões distribuídas, enquanto GitHub é uma plataforma que tem o ...


Compartilhe este artigo



Conheça o autor

Brewerton Santos

Brewerton Santos

Backend | Cloud | Community

Desenvolvedor de software e entusiasta de tecnologia da informação. Estruturando a carreira com base em tecnologias Microsoft e desenvolvimento open source.





3.133

Aulas disponíveis

292

horas de conteúdo

76.461

Alunos matriculados

53.012

Certificados emitidos





Comece de graça agora mesmo!

Temos mais de 21 cursos totalmente de graça e todos com certificado de conclusão.

Começar


Prefere algo mais Premium?

Conheça nossos planos



Premium anual

Compra única, parcelada em até
12x no cartão de crédito


12x R$

99

,79

=R$ 1.197,44
  • 1 ano de acesso
  • Acesso à todo conteúdo
  • Emissão de Certificado
  • Tira Dúvidas Online
  • 67 cursos disponíveis
  • 10 carreiras disponíveis
  • 161 temas de tecnologia
  • Conteúdo novo todo mês
  • Encontros Premium

Começar agora

Política de privacidade



Precisa de ajuda?

Dúvidas frequentes



  • Posso começar de graça?

    Sim! Basta criar sua conta gratuita no balta.io e começar seus estudos. Nós contamos com diversos cursos TOTALMENTE gratuitos e com certificado de conclusão.

  • Vou ter que pagar algo?

    Nós temos cursos gratuitos e pagos, porém você não precisa informar nenhum dado de pagamento para começar seus estudos gratuitamente conosco. Os cursos gratuitos são completos e com certificado de conclusão, você não paga nada por eles.

    Porém, caso queira algo mais Premium , você terá acesso à diversos benefícios que vão te ajudar ainda mais em sua carreira.

  • Por onde devo começar?

    Siga SEMPRE as nossas Carreiras , elas vão te orientar em todos os sentidos. Os cursos já estão organizados em categorias e carreiras para facilitar seu aprendizado.
    Nossa sugestão para aprendizado é começar pelo Backend e seguindo para Frontend e Mobile.

    • Backend
    • Frontend
    • Mobile

  • Os cursos ensinam tudo que preciso?

    Nenhum curso no mundo vai te ensinar tudo, desculpa ser sincero! Os cursos são uma base, eles fornecem por volta de 30% do que você precisa aprender, o resto é com você, com dedicação e MUITA prática.

  • O que eu devo estudar?

    Java ou .NET? Angular ou React? Xamarin ou Flutter? A resposta é simples e direta: "Você já sabe o básico?"

    Se você ainda não sabe BEM o básico, ou seja, os fundamentos, OOP, SOLID, Clean Code, está perdendo tempo estudando Frameworks ou até coisas mais avançadas como Docker. Foque nos seus objetivos primeiro.
    Agora se você está indeciso sobre qual Framework estudar, a boa notícia é que o mercado neste momento está bem aquecido e você tem várias oportunidade. Desta forma o que levaríamos em conta para tomar esta decisão seria:

    • Já sei o básico
    • O Framework/Tecnologia tem mercado onde eu estou (região)
    • O Framework/Tecnologia é utilizado em uma empresa onde quero atual
    • O Framework/Tecnologia resolve meu problema
    • Eu gosto de utilizar o Framework/Tecnologia

  • Estou pronto para estudar no balta.io?

    Com certeza! O primeiro passo é começar e você pode fazer isto agora mesmo!

    Começar de graça

Ainda tem dúvidas?





Assine nosso Newsletter

Receba em primeira mão todas as nossas novidades.

Cadastrar


balta.io

Sobre

  • Como funciona?
  • Seja Premium
  • Agenda
  • Blog
  • Todos os cursos

Cursos

  • Frontend
  • Backend
  • Mobile
  • Fullstack

Suporte

  • Termos de uso
  • Privacidade
  • Cancelamento
  • Central de ajuda

Redes Sociais

  • Telegram
  • Facebook
  • Instagram
  • YouTube
  • Twitch
  • LinkedIn
  • Discord