O que é um cursor?
As operações em um banco de dados relacional atuam em um conjunto completo de linhas. O conjunto de linhas retornado por uma instrução SELECT consiste em todas as linhas que atendem às condições na cláusula WHERE da instrução. Esse conjunto completo de linhas retornadas pela instrução é conhecido como o conjunto de resultados. Os aplicativos, especialmente aqueles que são interativos e online, nem sempre podem funcionar efetivamente com todo o conjunto de resultados como uma unidade. Esses aplicativos precisam de um mecanismo para trabalhar com uma linha ou um pequeno bloco de linhas de cada vez. Os cursores são uma extensão para conjuntos de resultados que fornecem esse mecanismo.
Um cursor é implementado por uma biblioteca de cursores. Uma biblioteca de cursores é um software, geralmente implementado como parte de um sistema de banco de dados ou 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 concorrência, posição no conjunto de resultados, número de linhas retornadas e se você pode mover para frente ou para trás (ou ambos) por meio do 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 relação a 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 é tão nomeado 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 passar a aprender as especificidades de seu uso no ADO.
Usando cursores, você pode:
Especifique o posicionamento em linhas específicas no conjunto de resultados.
Recupere uma linha ou um bloco de linhas com base na posição atual do conjunto de resultados.
Modifique os dados nas linhas na posição atual no conjunto de resultados.
Defina diferentes níveis de sensibilidade à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. Rolagem e seleção adicionais ocorrem para o restante da lista. No que diz respeito ao comprador, os produtos aparecem 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 cursores de várias maneiras:
Sem nenhuma linha.
Com algumas ou todas as linhas em uma única tabela.
Com algumas ou todas as linhas das tabelas logicamente unidas.
Como somente leitura ou atualizável pelo cursor ou no nível do campo.
Como somente para frente ou totalmente rolável.
Com o conjunto de teclas do cursor localizado no servidor.
Sensível a alterações de tabela subjacentes causadas por outros aplicativos (como associação, classificação, inserções, atualizações e exclusões).
Existente no servidor ou no cliente.
Os cursores somente leitura ajudam os usuários a navegar pelo conjunto de resultados e os cursores de leitura e escrita podem realizar atualizações de linha individuais. Cursores complexos podem ser definidos com conjuntos de chaves que apontam de volta para linhas de tabela base. Embora alguns cursores sejam somente leitura em direção à frente, outros podem se mover para frente e para trás e fornecer uma atualização dinâmica do conjunto de resultados com base nas alterações que outros aplicativos estão fazendo no banco de dados.
Nem todos os aplicativos precisam usar cursores para acessar ou atualizar dados. Algumas consultas simplesmente não exigem atualização direta de linha usando um cursor. Os cursores devem ser uma das últimas técnicas que você escolhe para recuperar dados e, em seguida, você deve escolher o cursor de impacto mais baixo possível. Quando você cria um conjunto de resultados usando um procedimento armazenado, o conjunto de resultados não é atualizável usando métodos de edição ou atualização do cursor.
Concorrência
Em alguns aplicativos multiusuários, é muito importante que os dados apresentados ao usuário final sejam o mais atuais possível. Um exemplo clássico de tal sistema é um sistema de reserva de companhias aéreas, onde muitos usuários podem estar disputando o mesmo assento em um determinado voo (e, portanto, um único registro). Em um caso como esse, o design do aplicativo deve lidar com operações simultâneas em um único registro.
Em outros aplicativos, a simultaneidade não é tão importante. Nesses casos, a despesa envolvida em manter os dados atualizados em todos os momentos não pode ser justificada.
Posição
Um cursor também acompanha 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 nesse local específico na matriz.
Capacidade de Rolagem
O tipo de cursor empregado pelo aplicativo também afeta a capacidade de avançar e voltar pelas linhas em um conjunto de resultados; às vezes, isso é chamado de rolagem. A capacidade de avançar e para trás por meio de um conjunto de resultados aumenta a complexidade do cursor e, portanto, é mais cara de implementar. Por esse motivo, você deve solicitar um cursor com essa funcionalidade somente quando necessário.