O que é um cursor?
As operações em um ato de banco de dados relacional em um conjunto completo de linhas. O conjunto de linhas retornado por uma instrução SELECT consiste em todas as linhas que satisfazem as condições na cláusula WHERE da instrução. Este conjunto completo de linhas retornado pela instrução é conhecido como conjunto de resultados. Os aplicativos, especialmente os aplicativos online interativos, não podem sempre trabalhar de maneira efetiva com todo o conjunto de resultados como uma unidade. Esses aplicativos precisam de um mecanismo para trabalhar com uma linha ou um bloco pequeno de linhas de cada vez. Os cursores são uma extensão dos conjuntos de resultados que proveem esse mecanismo.
Um cursor é implementado por uma biblioteca de cursores. Uma biblioteca de cursores é um programa de software, geralmente implementado como parte de um sistema de banco de dados ou de uma API de acesso a dados, que é usada para gerenciar atributos de dados retornados de uma fonte de dados (um conjunto de resultados). Esses atributos incluem gerenciamento de simultaneidade, posição no conjunto de resultados, número de linhas retornadas, além de indicar se é possível avançar e/ou retroceder no conjunto de resultados (capacidade de rolagem).
Um cursor mantém o controle da posição no conjunto de resultados e permite que você execute várias operações linha por linha em um conjunto de resultados, com ou sem retornar à tabela original. Em outras palavras, os cursores retornam conceitualmente um conjunto de resultados com base em tabelas dentro dos bancos de dados. O cursor é chamado assim porque indica a posição atual no conjunto de resultados, assim como o cursor em uma tela do computador indica a posição atual.
É importante se familiarizar com o conceito de cursores antes de seguir em frente para conhecer as especificidades do uso deles no ADO.
Usando cursores, você pode:
Especificar o posicionamento em linhas específicas do conjunto de resultados.
Recuperar uma linha ou um bloco de linhas com base na posição atual do conjunto de resultados.
Modificar os dados nas linhas na posição atual do conjunto de resultados.
Definir diferentes níveis de confidencialidade às alterações de dados feitas por outros usuários.
Por exemplo, considere um aplicativo que exibe uma lista de produtos disponíveis para um potencial comprador. O comprador percorre a lista para ver os detalhes e o custo do produto e, por fim, seleciona um produto para compra. A rolagem e a seleção adicionais ocorrem para o restante da lista. No que diz respeito ao comprador, os produtos são exibidos um de cada vez, mas o aplicativo usa um cursor rolável para navegar para cima e para baixo pelo conjunto de resultados.
Você pode usar os cursores de várias maneiras:
Sem nenhuma linha.
Com algumas ou todas as linhas em uma só tabela.
Com algumas ou todas as linhas de tabelas logicamente unidas.
Como somente leitura ou atualizáveis no nível do campo ou do cursor.
Como somente para frente ou totalmente rolável.
Com o conjunto de chaves do cursor localizado no servidor.
Sensíveis às alterações de tabela subjacente causadas por outros aplicativos (como associação, classificação, inserções, atualizações e exclusões).
Existentes no servidor ou no cliente.
Os cursores somente leitura ajudam os usuários a navegar pelo conjunto de resultados, e os cursores de leitura/gravação podem implementar atualizações de linha individuais. Os cursores complexos podem ser definidos com os conjuntos de chaves que apontam para linhas de tabela base. Embora alguns cursores sejam somente leitura na direção para frente, outros podem se avançar e retroceder e fornecer uma atualização dinâmica do conjunto de resultados com base nas alterações que outros aplicativos fazem no banco de dados.
Nem todos os aplicativos precisam usar cursores para acessar ou atualizar dados. Algumas consultas simplesmente não exigem a atualização direta de linha por meio de um cursor. Os cursores devem ser uma das últimas técnicas escolhida para recuperar os dados, e você deve escolher o cursor com o impacto mais baixo possível. Quando você cria um conjunto de resultados usando um procedimento armazenado, o conjunto de resultados não é atualizável por meio de métodos de edição ou de atualização do cursor.
Simultaneidade
Em alguns aplicativos multiusuário, é muito importante que os dados apresentados ao usuário final sejam os mais atuais possíveis. Um exemplo clássico desse sistema é um sistema de reservas de passagens aéreas, no qual muitos usuários podem estar disputando o mesmo assento em determinado voo (e, portanto, um só registro). Em um caso como esse, o design do aplicativo precisa lidar com operações simultâneas em um só registro.
Em outros aplicativos, a simultaneidade não é tão importante. Nesses casos, não é possível justificar a despesa envolvida em manter os dados atualizados o tempo todo.
Posição
Um cursor também controla a posição atual em um conjunto de resultados. Pense na posição do cursor como um ponteiro para o registro atual, semelhante à maneira como um índice de matriz aponta para o valor naquele local específico na matriz.
Rolagem
O tipo de cursor empregado pelo aplicativo também afeta a capacidade de avançar e retroceder pelas linhas em um conjunto de resultados. Isso, às vezes, é chamado de capacidade de rolagem. A capacidade de avançar e retroceder por um conjunto de resultados aumenta a complexidade do cursor e, portanto, é mais cara de ser implementada. Por esse motivo, você deve solicitar um cursor com essa funcionalidade somente quando necessário.