Cursores roláveis

Em aplicativos modernos baseados em tela, o usuário rola para frente e para trás nos dados. Para esses aplicativos, retornar para uma linha obtida anteriormente é um problema. Uma possibilidade é fechar e reabrir o cursor e efetuar fetch de linhas até que o cursor alcance a linha necessária. Outra opção é ler o conjunto de resultados, armazená-lo em cache localmente e implementar a rolagem no aplicativo. Ambas as opções funcionam bem apenas com pequenos conjuntos de resultados, e a última possibilidade é difícil de implementar. Uma solução melhor é usar um cursor rolável, que pode se avançar e recuar no conjunto de resultados.

Um cursor rolável costuma ser usado em aplicativos modernos baseados em tela nos quais o usuário rola para frente e para trás nos dados. Porém, os aplicativos devem usar cursores roláveis apenas quando os cursores somente de avanço não resolverem, já que os cursores roláveis costumam ser mais caros do que os cursores somente de avanço.

A capacidade de retroceder levanta uma questão não aplicável a cursores somente de avanço: um cursor rolável deve detectar alterações feitas em linhas buscadas anteriormente? Ou seja, deve detectar linhas atualizadas, excluídas e recém-inseridas?

Essa questão surge porque a definição de um conjunto de resultados (o conjunto de linhas que corresponde a determinados critérios) não indica quando as linhas são verificadas para ver se correspondem a esses critérios, nem indica se as linhas devem conter os mesmos dados sempre que é efetuado o fetch delas. A primeira omissão possibilita aos cursores roláveis detectar se linhas foram inseridas ou excluídas, enquanto a segunda lhes possibilita detectar dados atualizados.

A capacidade de detectar alterações às vezes é útil, mas nem sempre. Por exemplo, um aplicativo de contabilidade precisa de um cursor que ignore todas as alterações. O balanceamento de livros será impossível se o cursor mostrar as alterações mais recentes. Por outro lado, um sistema de reservas de companhias aéreas precisa de um cursor que mostre as últimas alterações nos dados. Sem esse cursor, ele deve consultar continuamente o banco de dados para mostrar a disponibilidade de voo mais atualizada.

Para atender às necessidades de diferentes aplicativos, o ODBC define quatro tipos diferentes de cursores roláveis. Esses cursores variam tanto em despesas quanto em sua capacidade de detectar alterações no conjunto de resultados. Note que um cursor rolável pode detectar alterações nas linhas apenas quando tenta efetuar fetch novamente dessas linhas; não há como a fonte de dados notificar o cursor dessas alterações nas linhas cujo fetch está sendo feito no momento. Note também que a visibilidade das alterações também é controlada pelo nível de isolamento da transação. Confira Isolamento de transações para obter mais informações.

Esta seção contém os tópicos a seguir.