NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!

UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI

Você está em: PrincipalArtigosWindows : Cursores
Quer receber novidades e e-books gratuitos?
Cursores

Introdução

As operações com conjuntos de linhas é uma das características que define um banco de dados relacional. Um conjunto pode ser vazio ou poderá conter uma única linha, mas ainda assim será um conjunto. Isso é útil e necessário para operações relacionais e algumas vezes inconvenientes para os aplicativos.

Apesar da expansão do SQL fornecida pelo T-SQL para tornar muito mais programável, ainda existem operações de alto cost, difíceis ou simplesmente impossíveis de se realizar em conjuntos.

Os cursores ajudam a lidar com algumas destas situações, pois é um objeto que aponta para uma determinada linha dentro de um conjunto. Podendo assim executar operações como: atualizar, excluir ou mover dados.

Entendendo os Cursores

O SQL Server suporta dois tipos de cursores: os cursores T-SQL e os cursores API (Application Programming Interface). Neste artigo falarei dos cursores do tipo T-SQL, isso porque para utilizarmos um cursor API teremos que ter a documentação apropriada de cada API que será utilizada, ou seja, os cursores do tipo API são específicos de cada API.

Os cursores T-SQL são criados usando o comando DECLARE CURSOR. Quando estamos utilizando um cursor a partir de uma aplicação conectada a um servidor Microsoft SQL Server, cada operação no cursor requer uma viagem de ida e volta através da rede.

O conjunto de linhas para o qual um cursor aponta é definido pelo comando SELECT. Existem algumas restrições SELECT ao se criar um cursor T-SQL:

  • Não poderá retornar vários conjuntos de linhas.
  • Não poderá conter a cláusula INTO para criar uma nova tabela.
  • Não poderá conter a cláusulas COMPUTE ou COMPUTE BY, contudo poderá conter funções agregadas, tais como AVG.

Vamos analisar algumas características dos cursores e para não confundir muito dividirei em três grupos de cursores pelas suas características:

    • Capacidade de refletir alterações em dados subjacentes.
    • Capacidade de rolar pelo conjunto de linhas.
    • Capacidade de atualizar o conjunto de linhas.

Refletindo alterações

Se criarmos um cursor com a instrução abaixo:

SELECT * FROM rg_cidade WHERE nmcidade LIKE '%i%'

O banco de dados irá retornar algo similar à imagem abaixo.

Imagine se alguém alterar a linha do registro ‘Farroupilha’ o que acontecerá com o conjunto de dados apontados pelo cursor?

Existem dois tipos de reflexos que podem ser determinados separadamente quando você criar o seu cursor:

  • Alterações nas quais as linhas estejam incluídas no conjunto
  • Alterações nos valores das linhas subjacentes.

Rolagem

Outra característica é se você poderá utilizar o cursor para rolar para frente e para trás ou somente para frente. Aqui encontraremos o velho dilema velocidade X flexibilidade. Os cursores que vão apenas para frente são significativamente mais rápidos, mas menos flexíveis.

Atualização

Por último, é se as linhas podem ser atualizadas pelo cursor. Mais uma vez, os cursores de somente leitura geralmente são mais eficientes, porem menos flexíveis.

Tipo de cursor

O T-SQL suporta quatro tipos de cursor diferentes:

  • Static
  • Keyset
  • Dynamic
  • Firehose

Cada tipo de cursor armazena os dados de maneira diferente e cada um suporta diferentes tipos de combinações de características descritas anteriormente. Veja a descrição de cada tipo de cursor abaixo:

Static: os cursores static fazem uma cópia dos dados especificados pela instrução SELECT e a armazena no banco de dados tempdb. Este tipo de cursor não permite alterações nos valores de associação ou dados, como qualquer atualização refletiria apenas uma cópia, este tipo é sempre somente leitura. Static podem, contudo ser declarados como forward-only (apenas para frente) ou scrollable (roláveis).

Keyset: um cursor keyset copia para o tempdb apenas as colunas necessárias para identificar exclusivamente cada linha. Para declarar um cursor deste tipo, cada tabela envolvida na instrução SELECT de definição deverá ter um índice exclusivo que defina o conjunto de chaves a ser copiado.

Os cursores keyset podem ser updatable (atualizáveis) ou read-only (somente-leitura) e também scrollable (roláveis) ou forward-only (apenas para frente).

Um cursor keyset é fixado quando você declara o cursor. Se uma linha que satisfaça as condições selecionadas for adicionada enquanto o cursor estiver aberto ela não será adicionada ao conjunto de dados.

Embora a associação na definição do cursor seja fixada quando você abre o cursor, as alterações aos valores de dados nas tabelas subjacentes geralmente são refletidas. Por exemplo, as alterações para o valor nmcidade da linha “Farroupilha” seriam retornadas pelo cursor. As alterações para os valores definidos por chaves, contudo refletirão no cursor apenas se forem feitas pelo cursor. Para continuar o exemplo anterior, se o valor fosse alterado pelo cursor, este retornaria, então, o valor alterado. Porém, se a alteração fosse feita por outro usuário, este cursor continuará retornando o valor anterior.

Dynamic: um cursor dynamic comporta-se como se uma instrução SELECT fosse lançada novamente sempre que uma linha fosse referenciada. Os cursores Dynamic refletem as alterações de valor tanto da associação quanto dos dados subjacentes, quer essas alterações tenham sido feitas pelo cursor ou por qualquer outro usuário.

Firehose: Esse tipo de cursor é declarado usando FAST_FORWARD, mas é mais conhecido como um cursor firehose. Existem duas restrições importantes quanto ao seu uso.

  • Se a instrução SELECT que define o cursor faz referencia a colunas do tipo text, ntext ou image e contiver a cláusula TOP, o SQL Server converterá o cursor firehose em um cursor keyset.
  • Se a instrução SELECT combinar tabelas que contenham triggers o cursor será convertido para static.

Criando cursores

Para criar um cursor utilizamos a instrução DECLARE CURSOR. A sintaxe da instrução DECLARE CURSOR copiada do Books Online é:

Veja abaixo a explicação para cada linha da instrução acima:

  1. É usado para definir o escopo do cursor assim como funciona em tabelas temporárias (@local ou @@global).
  2. Indica a rolagem a ser definida para o cursor e aceita as palavras-chaves: FORWARD_ONLY e SCROLL.
  3. Usado para definir o tipo do cursor a ser criado: STATIC, KEYSET, DYNAMIC e FAST_FORWARD.
  4. Indica o tipo de bloqueio, se as linhas poderão ser atualizadas pelo cursor e, se assim for, se outros usuários também poderão atualizá-los.
  5. Este parâmetro instrui o SQL Server para enviar uma mensagem de aviso para o cliente se um cursor for convertido do tipo especificado em outro tipo.
  6. Específica às linhas a serem incluídas no conjunto do cursor.
  7. Este parâmetro é opcional, por padrão os cursores são atualizáveis a não ser que o parâmetro de bloqueio seja READ_ONLY. Neste parâmetro podem-se especificar as linhas que permitem a atualização. Se forem omitidas todas as colunas na instrução serão atualizáveis.

Variáveis de cursor

O T-SQL permite declarar variáveis do tipo CURSOR. A sintaxe DECLARE padrão não cria o cursor, para isso use o SET a variável explicitamente. Este tipo de sintaxe é útil quando desejamos criar variáveis que possam ser atribuídas a diferentes cursores, o que poderá fazer se criar um procedimento genérico que opere em vários conjuntos de resultados.

Abrir um cursor

A declaração de um cursor cria um objeto cursor, mas não cria o conjunto de linhas que serão manipuladas pelo cursor. O conjunto do cursor não será criado até que se abra o cursor.

OPEN [GLOBAL] cursor_ou_variável

Feche um cursor

Após ter terminado de usar um cursor, devemos fechá-lo. A instrução CLOSE libera os recursos usados para manter o conjunto do cursor e também liberta quaisquer bloqueios que tenham sido colocados nas linhas se tiver usado parâmetros como: SCROLLOCKS.

CLOSE [GLOBAL] cursor_ou_variável

Desalocar um cursor

Na seqüência de criação de um cursor o DEALLOCATE é o último comando. Sua sintaxe é parecida com os comandos anteriores:

DEALLOCATE [GLOBAL] cursor_ou_variável

Este comando remove o identificador do cursor e não o cursor ou variável. O cursor não será removido até que os identificadores sejam desalocados ou fiquem fora do escopo.

Manipulando linhas com um cursor

O T-SQL suporta três comandos diferentes para trabalhar com cursores: FETCH, UPDATE e DELETE.

O comando FETCH recupera uma linha especifica do conjunto do cursor. Em sua forma mais simples, o comando FETCH possuí a seguinte sintaxe:

FETCH cursor_ou_variável

Um comando FETCH simples

Abaixo veremos um cursor criado para retornar o primeiro registro da tabela de cidades.

Podemos também utilizar o FETCH para armazenar o resultado em uma variável utilizando o FETCH cursor INTO variável. Veja o exemplo abaixo:

Além disso, podemos utilizar o FETCH para com uma combinação de palavras chaves, por exemplo:

  • FETCH FIRST – retorna a primeira linha da variável.
  • FETCH NEXT – retorna a linha seguinte.
  • FETCH  PRIOR – retorna a linha anterior.
  • FETCH RELATIVE n – retorna a linha n.
  • FETCH ABSOLUNT n – pode especificar linhas antes da linha atual.

FETCH NEXT com um cursor firehose

Atualizando linhas com um cursor

Desde que o cursor seja atualizável, alterar os valores subjacentes em um conjunto do cursor é bastante simples. Vejamos o exemplo abaixo:

Observe que este script irá retornar duas consultas, uma com o valor inicial do cursor e outro é o SELECT depois do UPDATE.

Monitoramento dos cursores

O T-SQL fornece duas variáveis globais e uma função para auxiliar a compreender o que está acontecendo com os cursores, @@CURSOR_ROWS que retorna o número de linhas no cursor aberto por último pela conexão, abaixo veremos uma tabela com os valores que podem ser retornados pela @@CURSOR_ROWS.


-m

O cursor ainda não foi completamente preenchido.

-1

O cursor é dinâmico e o número de linhas pode variar.

0

Ou nenhum cursor foi aberto ou o mais recente não foi fechado e liberado ou o cursor contem 0 linhas.

N

O número de linhas no cursor.

@@FETCH_STATUS retorna informações sobre o último comando FETCH que foi lançado, a tabela baixo mostra os valores de retorno para @@FETCH_STATUS.


0

O FETCH foi realizado com sucesso.

-1

O FETCH falhou.

-2

O registro trazido foi perdido.

CURSOR_STATUS é uma função T-SQL que possuí a seguinte sintaxe:

CURSOR_STATUS (tipo, cursor_ou_variável)

O tipo pode ser: local, global ou variable. Os resultados da função seguem na tabela abaixo:


1

Se a função for chamada para um cursor dynamic, o conjunto do cursor possuirá zero, uma ou mais linhas. Se a função for chamada para outro tipo de cursor, ela possuirá ao menos uma linha.

0

Conjunto de cursores está vazio.

-1

O cursor está fechado.

-2

É retornado apenas para as variáveis de cursor. Ou o cursor atribuído à variável especificada está fechado ou nenhum cursor foi atribuído à variável ainda.

-3

O cursor ou variável de cursor especificada não existe.

Conclusão

No dia-a-dia os cursores facilitam o desenvolvimento e facilitam o trabalho em conjunto de dados, ou seja, dados que não poderiam ser manipulados somente utilizando cláusulas básicas do SQL.

Entretanto, os cursores são uma “faca de dois gumes”. Tudo o que ele provém de facilidade, pode também converter-se em cost. Um exemplo clássico é uma consulta com um cursor em relação a um comando SELECT. O SELECT tem menos cost e o resultado final será o mesmo.

Partindo desta premissa recomendo utilizar cursores quando realmente sejam imprescindíveis.

Web site: www.crespi.pro.br

email: rodrigo@crespi.pro.br




Confira todos os artigos de Windows e Redes:

1 Como Criar Servidores Web com o Windows Server
1 Instalando o Google Chrome Com SCCM 2012 R2
1 Como Mapear Unidade De Rede Com Drive Maps
1 Como Utilizar Grupos Restritos No Active Directory
1 Como configurar o Client Push Installation no System Center
1 Como Criar uma Collection no System Center
1 Como Criar Atalho Na Área De Trabalho Com GPO
1 Como configurar a GPO para o System Center 2012 R2
1 Ninite Software Deployment
1 Guia de Certificação Microsoft
1 Como Alterar A Mascara de Rede No Escopo do DHCP
1 Como Criar uma GPO com WMI Filter
1 Como fazer uma migração de DHCP
1 Como Criar Pacotes de Instalação Automáticos e Silenciosos
1 Certificação ITIL
1 Como fazer download e instalar o VMWare Workstation 11
WINDOWS 7
1 Como Instalar o Windows 7 Automaticamente
1 Como Formatar o Windows 7
1 Os melhores Antivírus para Windows 7
1 Os melhores Aplicativos para Windows 7
1 Os melhores recursos do Windows 7
1 Como usar o Windows 7 para facilitar o seu dia a dia
1 Como escolher entre o Windows 7 e 8
WINDOWS 8
1 Como Formatar o Windows 8
1 Os melhores Antivírus para Windows 8
1 Os melhores Aplicativos para Windows 8
1 Os melhores recursos do Windows 8
1 Como usar o Windows 8 para facilitar o seu dia a dia
1 Principais diferenças entre o Windows 8 e 7
WINDOWS 2003 SERVER
1 Windows 2003 - DNS - Instalação do DNS e Criação de Zonas
1 Windows 2003 - DNS - Configurando as Propriedades de uma Zona
1 Windows 2003 - DNS - Configurando as Propriedades do Servidor DNS
1 Windows 2003 - DNS - Integração do DNS com o Active Directory
1 Windows 2003 - DNS - Atualização Dinâmica
1 Windows 2003 - DNS - Zonas de Pesquisa Inversa
1 Windows 2003 - MBSA - Microsoft Baseline Security Analyzer
1 Windows 2003 - Permissões de Compartilhamento
1 Windows 2003 - Permissões e Compartilhamento de Impressoras
1 Windows 2003 - Permissões NTFS
1 Windows 2003 - WINS - Introdução ao WINS
1 Windows 2003 - WINS - Instalação do WINS
1 Windows 2003 - WINS - Configurando as Propriedades do Servidor WINS
1 Windows 2003 - WINS - Replicação do WINS
1 Windows 2003 - DHCP – Instalação
1 Windows 2003 - DHCP - Configuração de Escopos
1 Windows 2003 - DHCP - Backup e Restore
1 Windows 2003 - DHCP - Compactando a Base de Dados do DHCP
1 Windows 2003 - DHCP - Auditoria no DHCP
1 Windows 2003 - Autenticação
1 Windows 2003 - Modelos de Segurança
WINDOWS - GERAL
1 Saiba Porque o Windows XP se Tornou uma Ameaça
1 Acesso Remoto [vídeo]
1 Como se preparar para os Exames da Microsoft [vídeo]
1 Cenários para utilização do Windows AIK - Parte 2
1 Cenários para utilização do Windows AIK - Parte 1
1 Windows AIK - Kit de Instalação Automática
1 Introdução ao MDT - Microsoft Deployment Toolkit
1 Implementando Infraestrutura entre Matriz e Filial - Parte 1
1 Implementando Infraestrutura entre Matriz e Filial - Parte 2
1 Implementando Infraestrutura entre Matriz e Filial - Parte 3
1 Implementando Infraestrutura entre Matriz e Filial - Parte 4
1 Caminhos de upgrade para o Windows Vista
1 Instalação do Windows Vista
1 Windows Vista Upgrade Advisor
1 Configurações básicas do Windows Mail
1 Contas de usuário no Windows Vista
1 Contatos do Windows
1 Cotas em disco no Windows Vista
1 Discos básicos no Windows Vista
1 Discos dinâmicos no Windows Vista
Seta Vídeo: Usando Sysprep e Ghost
Seta Vídeo: Instalando o Windows XP de forma automatizada
Seta Vídeo: Baixando atualizações do Windows e Integrando na Instalação – Parte 2
Seta Vídeo: Baixando atualizações do Windows e Integrando na Instalação – Parte 1
Seta Vídeo: Criando usuários e grupos no Active Directory com scripts automatizados
Seta Vídeo: RunAs Powerful - Script super poderoso
Seta Certificação - MCTS Windows 7
Seta Vídeo: Instalação do Serviço DNS - Parte 1
Seta Vídeo: Office Communications Server 2007 R2 – Parte 1
1 Virtual PC 2007 - Parte 2 - Instalação do Virtual PC 2007
1 Virtual PC 2007 - Parte 1 - Introdução ao Virtual PC 2007
ACTIVE DIRECTORY
1 Tutorial de Active Directory - Parte 5
1 Tutorial de Active Directory - Parte 4
1 Tutorial de Active Directory - Parte 3
1 Tutorial de Active Directory - Parte 2
1 Tutorial de Active Directory - Parte 1
1 Aprenda a Usar o VMware - Parte 2
1 Aprenda a Usar o VMware - Parte 1
1 Saiba Como Ter Boletos Bancários em Seu Site
1 Alterando o Texto do Botão Iniciar
1 System Restore (Restauração do Sistema)
1 Recovery Console (Console de Recuperação)
1 Pecados Mortais no uso do E-mail - Parte 2
1 Pecados Mortais no uso do E-mail
1 SUS - Implementação e Administração - Parte 2
1 SUS - Implementação e Administração - Parte 1
1 Windows Server 2003 - O novo recurso Shadow Copies
1 Tutorial sobre Profiles
1 Criptografia no Windows 2000 Server e o Agente de Recuperação
1 Tudo sobre Permissões de Segurança: Compartilhamento e NTFS
1 Implementando o DFS: Distributed File System
1 Boot no Windows 2000/XP e o arquivo Boot.ini
1 Gerenciamento de Discos e Armazenamento
WINDOWS 2000
1 DHCP no Windows 2000 Server
1 DNS no Windows 2000 Server
1 Implementação e Administração do SUS
1 Serviço RRAS no Windows 2000 Server
1 Introdução às redes com Windows 2000 – Parte 1
1 Introdução às redes com Windows 2000 – Parte 2
1 Introdução às redes com Windows 2000 – Parte 3
1 Primeiros passos com Ajax Control Toolkit
1 Faça a sua declaração de imposto de renda com Linux
1 Sistema de Controle de Gasolina Mobile
1 Série Visual Source Safe - Parte 1
1 Extraindo dados para arquivo texto
1 Como exibir informações com múltiplas instruções SQL
1 Expressões Regulares No Microsoft SQL Server 2000
1 Cursores
1 O Namespace My
1 JOB no SQL Server
1 Criando uma aplicação Windows Service
1 Criando Class Libraries com VB.NET - Parte 2
1 Criando Class Libraries com VB.NET
1 Importação de arquivos XML com SQL Server 2000
1 Web Services e AD/DBA
1 Criando Sequence com SQL Server
Quer receber novidades e e-books gratuitos?

Cursos Online

  • Banco de Dados
  • Carreira
  • Criação/Web
  • Excel/Projetos
  • Formação
  • + Todas as categorias
  • Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

    Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

    Todos os direitos reservados, Júlio Battisti 2001-2019 ®

    [LIVRO]: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2010 - PASSO-A-PASSO

    APRENDA COM JULIO BATTISTI - 1124 PÁGINAS: CLIQUE AQUI