Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Conformidade
Versão Introduzida: Normas ODBC 3.0 Conformidade: ISO 92
Summary
O SQLFetchScroll recolhe o conjunto de linhas especificado de dados do conjunto de resultados e devolve dados para todas as colunas limitadas. Os conjuntos de linhas podem ser especificados numa posição absoluta ou relativa ou por marcador de página.
Ao trabalhar com um driver ODBC 2.x, o Gestor de Drivers mapeia esta função para SQLExtendedFetch. Para mais informações, consulte Mapear Funções de Substituição para Compatibilidade Retroativa de Aplicações.
Syntax
SQLRETURN SQLFetchScroll(
SQLHSTMT StatementHandle,
SQLSMALLINT FetchOrientation,
SQLLEN FetchOffset);
Arguments
HandleStatement
[Entrada] Identificador do extrato.
FetchOrientation
[Entrada]
Tipo de busca:
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_ABSOLUTE
SQL_FETCH_RELATIVE
SQL_FETCH_BOOKMARK
Para mais informações, consulte "Posicionamento do Cursor" na secção "Comentários".
FetchOffset
[Entrada]
Número da fila a buscar. A interpretação deste argumento depende do valor do argumento FetchOrientation . Para mais informações, consulte "Posicionamento do Cursor" na secção "Comentários".
Devoluções
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.
Diagnósticos
Quando SQLFetchScroll devolve SQL_ERROR ou SQL_SUCCESS_WITH_INFO, um valor SQLSTATE associado pode ser obtido chamando SQLGetDiagRec com um HandleType de SQL_HANDLE_STMT e um Handle de StatementHandle. A tabela seguinte lista os valores SQLSTATE comumente devolvidos pelo SQLFetchScroll e explica cada um no contexto desta função; a notação "(DM)" precede as descrições dos SQLSTATEs devolvidas pelo Gestor de Drivers. O código de retorno associado a cada valor SQLSTATE é SQL_ERROR, salvo indicação em contrário. Se ocorrer um erro numa única coluna, o SQLGetDiagField pode ser chamado com um DiagIdentifier de SQL_DIAG_COLUMN_NUMBER para determinar a coluna onde o erro ocorreu; e SQLGetDiagField pode ser chamado com um DiagIdentifier de SQL_DIAG_ROW_NUMBER para determinar a linha que contém essa coluna.
Para todos os SQLSTATEs que podem devolver SQL_SUCCESS_WITH_INFO ou SQL_ERROR (exceto 01xxx SQLSTATEs), SQL_SUCCESS_WITH_INFO é devolvido se ocorrer um erro numa ou mais, mas não todas, linhas de uma operação de várias linhas, e SQL_ERROR é devolvido se ocorrer um erro numa operação de uma única linha.
| SQLSTATE | Erro | Descrição |
|---|---|---|
| 01000 | Aviso geral | Mensagem informativa específica para o condutor. (Função devolve SQL_SUCCESS_WITH_INFO.) |
| 01004 | Dados de cadeia, truncados à direita | Dados de string ou binários devolvidos para uma coluna resultavam na truncação de caracteres não em branco ou de dados binários não NULL. Se fosse um valor de cadeia, era truncado à direita. |
| 01S01 | Erro em linha | Ocorreu um erro ao buscar uma ou mais linhas. (Se este SQLSTATE for devolvido quando uma aplicação ODBC 3*.x* estiver a trabalhar com um driver ODBC 2*.x*, pode ser ignorado.) |
| 01S06 | Tentar buscar antes do conjunto de resultados devolver o primeiro conjunto de linhas | O conjunto de linhas solicitado sobrepunha o início do conjunto de resultados quando o FetchOrientation estava SQL_FETCH_PRIOR, a posição atual estava para além da primeira linha e o número da linha atual era menor ou igual ao tamanho do conjunto de linhas. O conjunto de linhas solicitado sobrepunha-se ao início do conjunto de resultados quando o FetchOrientation estava SQL_FETCH_PRIOR, a posição atual estava para além do fim do conjunto de resultados, e o tamanho do conjunto de linhas era maior do que o tamanho do conjunto de resultados. O conjunto de linhas solicitado sobrepunha-se ao início do conjunto de resultados quando o FetchOrientation estava SQL_FETCH_RELATIVE, o FetchOffset era negativo e o valor absoluto do FetchOffset era menor ou igual ao tamanho do conjunto de linhas. O conjunto de linhas solicitado sobrepunha-se ao início do conjunto de resultados quando o FetchOrientation era SQL_FETCH_ABSOLUTE, o FetchOffset era negativo e o valor absoluto do FetchOffset era maior do que o tamanho do conjunto de resultados, mas inferior ou igual ao tamanho do conjunto de linhas. (Função devolve SQL_SUCCESS_WITH_INFO.) |
| 01S07 | Truncamento fracionado | Os dados devolvidos para uma coluna eram truncados. Para tipos de dados numéricos, a parte fracionária do número era truncada. Para tipos de dados de tempo, carimbo temporal e intervalo contendo um componente temporal, a parte fracionária do tempo foi truncada. (Função devolve SQL_SUCCESS_WITH_INFO.) |
| 07006 | Violação de atributo de tipo de dado restrito | O valor de dados de uma coluna no conjunto de resultados não podia ser convertido para o tipo de dados especificado pelo TargetType no SQLBindCol. A coluna 0 era atribuída a um tipo de dado SQL_C_BOOKMARK, e o atributo da instrução SQL_ATTR_USE_BOOKMARKS era definido como SQL_UB_VARIABLE. A coluna 0 foi atribuída a um tipo de dado SQL_C_VARBOOKMARK, e o atributo da instrução SQL_ATTR_USE_BOOKMARKS não foi definido como SQL_UB_VARIABLE. |
| 07009 | Índice de descritores inválido | O controlador era um ODBC 2*.x* que não suporta SQLExtendedFetch, e o número de coluna especificado na ligação para uma coluna era 0. A coluna 0 foi encadernada, e o atributo da instrução SQL_ATTR_USE_BOOKMARKS foi definido para SQL_UB_OFF. |
| 08S01 | Falha da ligação de comunicação | A ligação de comunicação entre o driver e a fonte de dados à qual o driver estava ligado falhou antes de a função concluir o processamento. |
| 22001 | Dados de cadeia, truncados à direita | Um marcador de página de comprimento variável devolvido para uma coluna era truncado. |
| 22002 | Variável indicadora necessária, mas não fornecida | Os dados NULL eram recolhidos numa coluna cujo StrLen_or_IndPtr definido pelo SQLBindCol (ou SQL_DESC_INDICATOR_PTR conjunto pelo SQLSetDescField ou SQLSetDescRec) era um ponteiro nulo. |
| 22003 | Valor numérico fora do intervalo | Devolver o valor numérico (como numérico ou string) para uma ou mais colunas encadernadas teria feito com que toda a parte (em vez de fracionária) do número fosse truncada. Para mais informações, consulte Conversão de Dados de SQL para Tipos de Dados C no Apêndice D: Tipos de Dados. |
| 22007 | Formato de data-hora inválido | Uma coluna de caracteres no conjunto de resultados era associada a uma estrutura C, data, hora ou carimbo temporal, e um valor na coluna era, respetivamente, uma data, hora ou carimbo temporal inválido. |
| 22012 | Divisão por zero | Um valor de uma expressão aritmética era devolvido, o que resultava numa divisão por zero. |
| 22015 | Excesso de campo de intervalo | Atribuir de um tipo SQL numérico ou de intervalo exato a um tipo C de intervalo causava uma perda significativa de dígitos no campo principal. Ao buscar dados para um tipo de intervalo C, não havia representação do valor do tipo SQL no tipo de intervalo C. |
| 22018 | Valor de personagem inválido para especificação de elenco | Uma coluna de caracteres no conjunto de resultados estava associada a um buffer de caracteres C, e a coluna continha um carácter para o qual não havia representação no conjunto de caracteres do buffer. O tipo C era um tipo numérico exato ou aproximado, uma data-hora ou um tipo de dado de intervalo; o tipo SQL da coluna era um tipo de dado de carácter; e o valor na coluna não era um literal válido do tipo C limitado. |
| 24000 | Estado do cursor inválido | O StatementHandle estava num estado executado, mas nenhum conjunto de resultados estava associado ao StatementHandle. |
| 40001 | Falha de serialização | A transação em que o fetch foi executado foi terminada para evitar um impasse. |
| 40003 | Conclusão da afirmação desconhecida | A ligação associada falhou durante a execução desta função, e o estado da transação não pode ser determinado. |
| HY000 | Erro geral | Ocorreu um erro para o qual não existia um SQLSTATE específico e para o qual não estava definido nenhum SQLSTATE específico da implementação. A mensagem de erro devolvida pelo SQLGetDiagRec no buffer *MessageText descreve o erro e a sua causa. |
| HY001 | Erro de alocação de memória | O driver não conseguia alocar a memória necessária para suportar a execução ou conclusão da função. |
| HY008 | Operação cancelada | O processamento assíncrono foi ativado para o StatementHandle. A função era chamada e, antes de terminar a execução, o SQLCancel ou SQLCancelHandle era chamado no StatementHandle. Depois, a função era chamada novamente no StatementHandle. A função era chamada e, antes de terminar a execução, o SQLCancel ou SQLCancelHandle era chamado no StatementHandle a partir de um thread diferente numa aplicação multithread. |
| HY010 | Erro de sequência de funções | (DM) Uma função de execução assíncrona era chamada para o handle de ligação associado ao StatementHandle. Esta função assíncrona ainda estava a ser executada quando a função SQLFetchScroll foi chamada. (DM) SQLExecute, SQLExecDirect ou SQLMoreResults era chamado para o StatementHandle e devolvido SQL_PARAM_DATA_AVAILABLE. Esta função era chamada antes de os dados serem recuperados para todos os parâmetros transmitidos. (DM) O HandleStatement especificado não estava num estado executado. A função era chamada sem antes chamar SQLExecDirect, SQLExecute ou uma função de catálogo. (DM) Uma função de execução assíncrona (não esta) era chamada para o StatementHandle e continuava a ser executada quando esta função era chamada. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations ou SQLSetPos era chamado para o StatementHandle e devolvido SQL_NEED_DATA. Esta função era chamada antes de os dados serem enviados para todos os parâmetros ou colunas de dados na execução. (DM) SQLFetch foi chamado para o StatementHandle depois de ser chamado SQLExtendedFetch e antes de SQLFreeStmt com a opção SQL_CLOSE ser chamada. |
| HY013 | Erro de gestão de memória | A chamada de função não podia ser processada porque os objetos de memória subjacentes não podiam ser acedidos, possivelmente devido a condições de baixa memória. |
| HY090 | Comprimento inválido da corda ou do buffer | O atributo da instrução SQL_ATTR_USE_BOOKMARK foi definido para SQL_UB_VARIABLE, e a coluna 0 foi atribuída a um buffer cujo comprimento não era igual ao comprimento máximo do marcador para este conjunto de resultados. (Este comprimento está disponível no campo SQL_DESC_OCTET_LENGTH do IRD e pode ser obtido chamando SQLDescribeCol, SQLColAttributes ou SQLGetDescField.) |
| HY106 | Tipo de busca fora do alcance | DM) O valor especificado para o argumento FetchOrientation era inválido. (DM) O argumento FetchOrientation foi SQL_FETCH_BOOKMARK, e o atributo da SQL_ATTR_USE_BOOKMARKS foi definido para SQL_UB_OFF. O valor do atributo da SQL_ATTR_CURSOR_TYPE sentença era SQL_CURSOR_FORWARD_ONLY, e o valor do argumento FetchOrientation não era SQL_FETCH_NEXT. O valor do atributo da SQL_ATTR_CURSOR_SCROLLABLE instrução era SQL_NONSCROLLABLE, e o valor do argumento FetchOrientation não era SQL_FETCH_NEXT. |
| HY107 | Valor da linha fora do intervalo | O valor especificado com o atributo de instrução SQL_ATTR_CURSOR_TYPE era SQL_CURSOR_KEYSET_DRIVEN, mas o valor especificado com o atributo de instrução SQL_ATTR_KEYSET_SIZE era maior que 0 e inferior ao valor especificado com o atributo de instrução SQL_ATTR_ROW_ARRAY_SIZE. |
| HY111 | Valor de marcador inválido | O argumento FetchOrientation era SQL_FETCH_BOOKMARK, e o marcador apontado pelo valor no atributo da instrução SQL_ATTR_FETCH_BOOKMARK_PTR não era válido ou era um ponteiro nulo. |
| HY117 | A ligação é suspensa devido ao estado desconhecido da transação. Apenas funções de desconexão e de leitura são permitidas. | (DM) Para mais informações sobre o estado suspenso, veja Função SQLEndTran. |
| HYC00 | Funcionalidade opcional não implementada | O driver ou fonte de dados não suporta a conversão especificada pela combinação do TargetType no SQLBindCol e do tipo de dados SQL da coluna correspondente. |
| HYT00 | O tempo limite expirou | O período de tempo de espera da consulta expirava antes de a fonte de dados devolver o conjunto de resultados solicitado. O período de tempo é definido através do SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT. |
| HYT01 | Expirou o tempo limite de ligação | O período de timeout da ligação expirou antes de a fonte de dados responder ao pedido. O período de tempo de expiração da ligação é definido através do SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
| IM001 | O driver não suporta esta função | (DM) O driver associado ao StatementHandle não suporta a função. |
| IM017 | A sondagem está desativada no modo de notificação assíncrona | Sempre que o modelo de notificação é utilizado, o sonding é desativado. |
| IM018 | O SQLCompleteAsync não foi chamado para completar a operação assíncrona anterior neste handle. | Se a chamada de função anterior no handle devolver SQL_STILL_EXECUTING e se o modo de notificação estiver ativado, o SQLCompleteAsync deve ser chamado no handle para fazer o pós-processamento e completar a operação. |
Comments
SQLFetchScroll devolve um conjunto de linhas especificado do conjunto de resultados. Os conjuntos de linhas podem ser especificados por posição absoluta ou relativa ou por favorito. SQLFetchScroll só pode ser chamado enquanto existe um conjunto de resultados – ou seja, após uma chamada que cria um conjunto de resultados e antes de o cursor sobre esse conjunto ser fechado. Se alguma coluna estiver vinculada, devolve os dados nessas colunas. Se a aplicação especificou um ponteiro para um array de estado de linhas ou um buffer onde devolver o número de linhas buscadas, o SQLFetchScroll devolve também esta informação. Chamadas para SQLFetchScroll podem ser misturadas com chamadas para SQLFetch , mas não podem ser misturadas com chamadas para SQLExtendedFetch.
Para mais informações, consulte Uso de Cursores de Bloco e Utilização de Cursores Roláveis.
Posicionamento do Cursor
Quando o conjunto de resultados é criado, o cursor é posicionado antes do início do conjunto de resultados. SQLFetchScroll posiciona o cursor de bloco com base nos valores dos argumentos FetchOrientation e FetchOffset , conforme mostrado na tabela seguinte. As regras exatas para determinar o início do novo conjunto de linhas são apresentadas na secção seguinte.
| FetchOrientation | Meaning |
|---|---|
| SQL_FETCH_NEXT | Devolve o próximo conjunto de linhas. Isto é equivalente a chamar SQLFetch. O SQLFetchScroll ignora o valor do FetchOffset. |
| SQL_FETCH_PRIOR | Devolve o conjunto de linhas anterior. O SQLFetchScroll ignora o valor do FetchOffset. |
| SQL_FETCH_RELATIVE | Devolva o conjunto de linhas FetchOffset do início do conjunto de linhas atual. |
| SQL_FETCH_ABSOLUTE | Devolva o conjunto de linhas começando na linha FetchOffset. |
| SQL_FETCH_FIRST | Devolva o primeiro conjunto de linhas no conjunto de resultados. O SQLFetchScroll ignora o valor do FetchOffset. |
| SQL_FETCH_LAST | Devolva o último conjunto completo de linhas no conjunto de resultados. O SQLFetchScroll ignora o valor do FetchOffset. |
| SQL_FETCH_BOOKMARK | Devolva as linhas FetchOffset do conjunto de linhas do marcador especificado pelo atributo da instrução SQL_ATTR_FETCH_BOOKMARK_PTR. |
Os drivers não são obrigados a suportar todas as orientações de busca; uma aplicação chama SQLGetInfo com um tipo de informação SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 ou SQL_STATIC_CURSOR_ATTRIBUTES1 (dependendo do tipo de cursor) para determinar quais as orientações de busca suportadas pelo driver. A aplicação deve analisar as máscaras de bits SQL_CA1_NEXT, SQL_CA1_RELATIVE, SQL_CA1_ABSOLUTE e WQL_CA1_BOOKMARK nestes tipos de informação. Além disso, se o cursor for apenas para frente e o FetchOrientation não estiver SQL_FETCH_NEXT, o SQLFetchScroll devolve SQLSTATE HY106 (tipo Fetch fora do alcance).
O atributo da instrução SQL_ATTR_ROW_ARRAY_SIZE especifica o número de linhas no conjunto de linhas. Se o conjunto de linhas que está a ser obtido pelo SQLFetchScroll se sobrepõe ao final do conjunto de resultados, o SQLFetchScroll devolve um conjunto parcial de linhas. Ou seja, se S + R - 1 for maior que L, onde S é a linha inicial do conjunto de linhas a ser buscado, R é o tamanho do conjunto de linhas, e L é a última linha do conjunto de resultados, então apenas as primeiras L - S + 1 linhas do conjunto são válidas. As restantes linhas estão vazias e têm o estado de SQL_ROW_NOROW.
Depois de o SQLFetchScroll regressar, a linha atual é a primeira linha do conjunto de linhas.
Regras de Posicionamento do Cursor
As secções seguintes descrevem as regras exatas para cada valor do FetchOrientation. Estas regras usam a seguinte notação.
| Anotações | Meaning |
|---|---|
| Antes de começar | O cursor de bloco está posicionado antes do início do conjunto de resultados. Se a primeira linha do novo conjunto de linhas for anterior ao início do conjunto de resultados, SQLFetchScroll devolve SQL_NO_DATA. |
| Após o fim | O cursor de bloco é posicionado após o final do conjunto de resultados. Se a primeira linha do novo conjunto de linhas for posterior ao fim do conjunto de resultados, SQLFetchScroll devolve SQL_NO_DATA. |
| CurrRowsetStart | O número da primeira linha do conjunto atual. |
| LastResultRow | O número da última linha do conjunto de resultados. |
| RowsetSize | O tamanho do conjunto de linhas. |
| FetchOffset | O valor do argumento FetchOffset . |
| BookmarkRow | A linha correspondente ao marcador especificado pelo atributo SQL_ATTR_FETCH_BOOKMARK_PTR sentença. |
SQL_FETCH_NEXT
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| Antes de começar | 1 |
| CurrRowSetStart + RowsetSize[1] <= LastResultRow | CurrRowsetStart + RowsetSize[1] |
| CurrRowSetStart + RowsetSize[1]> LastResultRow | Após o fim |
| Após o fim | Após o fim |
[1] Se o tamanho do conjunto de linhas foi alterado desde a chamada anterior para buscar linhas, este é o tamanho do conjunto de linhas usado com a chamada anterior.
SQL_FETCH_PRIOR
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| Antes de começar | Antes de começar |
| CurrRowsetStart = 1 | Antes de começar |
| 1 < CurrRowsetStart <= RowsetSize[2] | 1[1] |
| CurrRowsetStart > RowsetSize[2] | CurrRowsetStart - RowsetSize[2] |
| Após o fim E a LastResultRow < RowsetSize[2] | 1[1] |
| Depois de terminar E LastResultRow >= RowSetSize[2] | LastResultRow - RowSetSize + 1[2] |
[1] SQLFetchScroll devolve SQLSTATE 01S06 (Tentativa de buscar antes do conjunto de resultados devolver o primeiro conjunto de linhas) e SQL_SUCCESS_WITH_INFO.
[2] Se o tamanho do conjunto de linhas foi alterado desde a chamada anterior para buscar linhas, este é o novo tamanho do conjunto de linhas.
SQL_FETCH_RELATIVE
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| (Antes de start E FetchOffset > 0) OU (Depois do fim E FetchOffset < 0) | -- [1] |
| BeforeStart E FetchOffset <= 0 | Antes de começar |
| CurrRowsetStart = 1 E FetchOffset < 0 | Antes de começar |
| CurrRowsetStart > 1 E CurrRowsetStart + FetchOffset < 1 E | FetchOffset | > RowsetSize[3] | Antes de começar |
| CurrRowsetStart > 1 E CurrRowsetStart + FetchOffset < 1 E | FetchOffset | <= RowsetSize[3] | 1[2] |
| 1 <= CurrRowSetStart + FetchOffset <= LastResultRow | CurrRowsetStart + FetchOffset |
| CurrRowsetStart + FetchOffset > LastResultRow | Após o fim |
| Após o fim E FetchOffset >= 0 | Após o fim |
[1] O SQLFetchScroll devolve o mesmo conjunto de linhas que se fosse chamado com o FetchOrientation definido para SQL_FETCH_ABSOLUTE. Para mais informações, consulte a secção "SQL_FETCH_ABSOLUTE".
[2] SQLFetchScroll devolve SQLSTATE 01S06 (Tentar buscar antes do conjunto de resultados devolver o primeiro conjunto de linhas) e SQL_SUCCESS_WITH_INFO.
[3] Se o tamanho do conjunto de linhas foi alterado desde a chamada anterior para buscar linhas, este é o novo tamanho do conjunto de linhas.
SQL_FETCH_ABSOLUTE
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| FetchOffset < 0 E | FetchOffset | <= LastResultRow | LastResultRow + FetchOffset + 1 |
| FetchOffset < 0 E | FetchOffset | > LastResultRow E | FetchOffset | > RowsetSize[2] | Antes de começar |
| FetchOffset < 0 E | FetchOffset | > LastResultRow E | FetchOffset | <= RowsetSize[2] | 1[1] |
| FetchOffset = 0 | Antes de começar |
| 1 <= FetchOffset <= LastResultRow | FetchOffset |
| FetchOffset > LastResultRow | Após o fim |
[1] SQLFetchScroll devolve SQLSTATE 01S06 (Tentativa de buscar antes do conjunto de resultados devolver o primeiro conjunto de linhas) e SQL_SUCCESS_WITH_INFO.
[2] Se o tamanho do conjunto de linhas foi alterado desde a chamada anterior para buscar linhas, este é o novo tamanho do conjunto de linhas.
Uma busca absoluta realizada contra um cursor dinâmico não pode fornecer o resultado desejado porque as posições das linhas num cursor dinâmico são indeterminadas. Tal operação é equivalente a um fetch seguido primeiro de um relativo de fetch; não é uma operação atómica, como é uma busca absoluta num cursor estático.
SQL_FETCH_FIRST
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| Qualquer | 1 |
SQL_FETCH_LAST
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| RowsetSize[1]<= LastResultRow | LastResultRow - RowSetSize + 1[1] |
| RowSetSize[1]> LastResultRow | 1 |
[1] Se o tamanho do conjunto de linhas foi alterado desde a chamada anterior para buscar linhas, este é o novo tamanho do conjunto de linhas.
SQL_FETCH_BOOKMARK
Aplicam-se as seguintes regras.
| Condição | Primeira linha do novo conjunto de linhas |
|---|---|
| BookmarkRow + FetchOffset < 1 | Antes de começar |
| 1 <= LinhaDeFavorito + DeslocamentoDeBusca <= LinhaDeResultadoDeÚltimo | BookmarkRow + FetchOffset |
| BookmarkRow + FetchOffset > LastResultRow | Após o fim |
Para informações sobre favoritos, consulte Bookmarks (ODBC).
Efeito das linhas apagadas, adicionadas e de erro no movimento do cursor
Cursores estáticos e controlados por conjuntos de chaves por vezes detetam linhas adicionadas ao conjunto de resultados e removem linhas eliminadas do conjunto. Ao chamar SQLGetInfo com as opções SQL_STATIC_CURSOR_ATTRIBUTES2 e SQL_KEYSET_CURSOR_ATTRIBUTES2 e ao analisar as máscaras de bits SQL_CA2_SENSITIVITY_ADDITIONS, SQL_CA2_SENSITIVITY_DELETIONS e SQL_CA2_SENSITIVITY_UPDATES, uma aplicação determina se os cursores implementados por um determinado driver fazem isto. Para os drivers que conseguem detetar e remover linhas eliminadas, os parágrafos seguintes descrevem os efeitos deste comportamento. Para drivers que conseguem detetar linhas eliminadas mas não as conseguem remover, as eliminações não têm efeito nos movimentos do cursor, e os parágrafos seguintes não se aplicam.
Se o cursor detetar linhas adicionadas ao conjunto de resultados ou remover linhas eliminadas do conjunto de resultados, parece que só deteta essas alterações quando obtém dados. Isto inclui o caso em que SQLFetchScroll é chamado com FetchOrientation definido para SQL_FETCH_RELATIVE e FetchOffset para 0 para recuperar o mesmo conjunto de linhas, mas não inclui o caso em que SQLSetPos é chamado com fOption definido para SQL_REFRESH. Neste último caso, os dados nos buffers do conjunto de linhas são atualizados, mas não recuperados, e as linhas eliminadas não são removidas do conjunto de resultados. Assim, quando uma linha é eliminada ou inserida no conjunto de linhas atual, o cursor não modifica os buffers do conjunto de linhas. Em vez disso, deteta a alteração quando recupera qualquer conjunto de linhas que anteriormente incluía a linha eliminada ou que agora inclui a linha inserida.
Por exemplo:
// Fetch the next rowset.
SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
// Delete third row of the rowset. Does not modify the rowset buffers.
SQLSetPos(hstmt, 3, SQL_DELETE, SQL_LOCK_NO_CHANGE);
// The third row has a status of SQL_ROW_DELETED after this call.
SQLSetPos(hstmt, 3, SQL_REFRESH, SQL_LOCK_NO_CHANGE);
// Refetch the same rowset. The third row is removed, replaced by what
// was previously the fourth row.
SQLFetchScroll(hstmt, SQL_FETCH_RELATIVE, 0);
Quando o SQLFetchScroll devolve um novo conjunto de linhas que tem uma posição relativa ao conjunto atual – ou seja, o FetchOrientation é SQL_FETCH_NEXT, SQL_FETCH_PRIOR ou SQL_FETCH_RELATIVE – não inclui alterações ao conjunto de linhas atual ao calcular a posição inicial do novo conjunto de linhas. No entanto, inclui alterações fora do conjunto de linhas atual, caso seja capaz de as detetar. Além disso, quando o SQLFetchScroll devolve um novo conjunto de linhas que tem uma posição independente do conjunto de linhas atual – ou seja, o FetchOrientation é SQL_FETCH_FIRST, SQL_FETCH_LAST, SQL_FETCH_ABSOLUTE ou SQL_FETCH_BOOKMARK – inclui todas as alterações que é capaz de detetar, mesmo que estejam no conjunto de linhas atual.
Ao determinar se as linhas recém-adicionadas estão dentro ou fora do conjunto de linhas atual, considera-se que um conjunto parcial termina na última linha válida; ou seja, a última linha para a qual o estado de linha não é SQL_ROW_NOROW. Por exemplo, suponha que o cursor é capaz de detetar linhas recém-adicionadas, o conjunto de linhas atual é parcial, a aplicação adiciona novas linhas e o cursor adiciona essas linhas ao final do conjunto de resultados. Se a aplicação chamar SQLFetchScroll com FetchOrientation definido para SQL_FETCH_NEXT, SQLFetchScroll devolve o conjunto de linhas a partir da primeira linha recém-adicionada.
Por exemplo, suponha que o conjunto de linhas atual compreende as linhas 21 a 30, o tamanho do conjunto de linhas é 10, o cursor remove as linhas eliminadas do conjunto de resultados e o cursor deteta linhas adicionadas ao conjunto de resultados. A tabela seguinte mostra as linhas que o SQLFetchScroll devolve em várias situações.
| Alterar | Tipo de busca | FetchOffset | Novo conjunto de linhas[1] |
|---|---|---|---|
| Eliminar linha 21 | SEGUINTE | 0 | 31 a 40 |
| Eliminar a linha 31 | SEGUINTE | 0 | 32 a 41 |
| Inserir a linha entre as linhas 21 e 22 | SEGUINTE | 0 | 31 a 40 |
| Inserir a fila entre as linhas 30 e 31 | SEGUINTE | 0 | Linha inserida, 31 a 39 |
| Eliminar linha 21 | PRIOR | 0 | 11 a 20 |
| Eliminar linha 20 | PRIOR | 0 | 10 a 19 |
| Inserir a linha entre as linhas 21 e 22 | PRIOR | 0 | 11 a 20 |
| Insira a carreira entre as linhas 20 e 21 | PRIOR | 0 | 12 a 20, fila inserida |
| Eliminar linha 21 | RELATIVO | 0 | 22 a 31[2] |
| Eliminar linha 21 | RELATIVO | 1 | 22 a 31 |
| Inserir a linha entre as linhas 21 e 22 | RELATIVO | 0 | 21, fila inserida, 22 a 29 |
| Inserir a linha entre as linhas 21 e 22 | RELATIVO | 1 | 22 a 31 |
| Eliminar linha 21 | ABSOLUTE | 21 | 22 a 31[2] |
| Apagar a linha 22 | ABSOLUTE | 21 | 21, 23 a 31 |
| Inserir a linha entre as linhas 21 e 22 | ABSOLUTE | 22 | Linha inserida, 22 a 29 |
[1] Esta coluna utiliza os números das linhas antes de quaisquer linhas serem inseridas ou eliminadas.
[2] Neste caso, o cursor tenta devolver as linhas que começam na linha 21. Como a linha 21 foi eliminada, a primeira linha que devolve é a linha 22.
As linhas de erro (isto é, linhas com estado de SQL_ROW_ERROR) não afetam o movimento do cursor. Por exemplo, se o conjunto de linhas atual começar com a linha 11 e o estado da linha 11 for SQL_ROW_ERROR, chamar SQLFetchScroll com FetchOrientation definido para SQL_FETCH_RELATIVE e FetchOffset para 5 devolve o conjunto de linhas que começa na linha 16, tal como aconteceria se o estado da linha 11 fosse SQL_SUCCESS.
Retorno de dados em colunas encadernadas
O SQLFetchScroll devolve dados em colunas limitadas da mesma forma que o SQLFetch. Para mais informações, consulte "Devolvendo Dados em Colunas Limitadas" na Função SQLFetch.
Se nenhuma coluna for atribuída, o SQLFetchScroll não devolve dados, mas move o cursor de bloco para a posição especificada. Se os dados podem ser recuperados de colunas não vinculadas de um cursor de bloco com SQLGetData depende do driver. Esta funcionalidade é suportada se uma chamada ao SQLGetInfo devolver o bit SQL_GD_BLOCK para o tipo de informação SQL_GETDATA_EXTENSIONS.
Endereços de Buffer
O SQLFetchScroll utiliza a mesma fórmula para determinar o endereço dos dados e os buffers de comprimento/indicador que o SQLFetch. Para mais informações, consulte "Endereços de Buffer" na Função SQLBindCol.
Matriz de estado da linha
O SQLFetchScroll define valores no array de estado da linha da mesma forma que o SQLFetch. Para mais informações, consulte "Row Status Array" em SQLFetch Function.
Rows Fetched Buffer
O SQLFetchScroll devolve o número de linhas obtidas no buffer buscado das linhas da mesma forma que o SQLFetch. Para mais informações, veja "Rows Fetched Buffer" em SQLFetch Function.
Tratamento de erros
Quando uma aplicação chama SQLFetchScroll num driver ODBC 3.x, o Gestor de Drivers chama SQLFetchScroll no driver. Quando uma aplicação chama SQLFetchScroll num driver ODBC 2.x, o Gestor de Controladores chama SQLExtendedFetch no driver. Como o SQLFetchScroll e o SQLExtendedFetch tratam erros de forma ligeiramente diferente, a aplicação apresenta comportamentos ligeiramente diferentes ao chamar SQLFetchScroll nos drivers ODBC 2.x e ODBC 3.x.
O SQLFetchScroll devolve erros e avisos da mesma forma que o SQLFetch; para mais informações, consulte "Gestão de Erros" no SQLFetch. O SQLExtendedFetch devolve erros da mesma forma que o SQLFetch, com as seguintes exceções:
Quando ocorre um aviso que se aplica a uma determinada linha no conjunto de linhas, o SQLExtendedFetch define a entrada correspondente no array de estado da linha como SQL_ROW_SUCCESS, e não SQL_ROW_SUCCESS_WITH_INFO.
Se ocorrerem erros em todas as linhas do conjunto de linhas, SQLExtendedFetch devolve SQL_SUCCESS_WITH_INFO, não SQL_ERROR.
Em cada grupo de registos de estado que se aplica a uma linha individual, o primeiro registo de estado devolvido pelo SQLExtendedFetch deve conter SQLSTATE 01S01 (Erro na linha); O SQLFetchScroll não devolve este SQLSTATE. Se o SQLExtendedFetch não conseguir devolver SQLSTATEs adicionais, ainda terá de devolver esse SQLSTATE.
SQLFetchScroll e Concorrência Otimista
Se um cursor usar concorrência otimista – ou seja, o atributo da instrução SQL_ATTR_CONCURRENCY tiver um valor de SQL_CONCUR_VALUES ou SQL_CONCUR_ROWVER – o SQLFetchScroll atualiza os valores de concorrência otimista usados pela fonte de dados para detetar se uma linha mudou. Isto acontece sempre que o SQLFetchScroll obtém um novo conjunto de linhas, incluindo quando recupera o conjunto de linhas atual. (É chamado com FetchOrientation definido para SQL_FETCH_RELATIVE e FetchOffset definido para 0.)
Controladores SQLFetchScroll e ODBC 2.x
Quando uma aplicação chama SQLFetchScroll num driver ODBC 2.x, o Gestor de Drivers mapeia esta chamada para SQLExtendedFetch. Passa os seguintes valores para os argumentos do SQLExtendedFetch.
| Argumento SQLExtendedFetch | Valor |
|---|---|
| StatementHandle | StatementHandle em SQLFetchScroll. |
| FetchOrientation | FetchOrientation em SQLFetchScroll. |
| FetchOffset | Se FetchOrientation não for SQL_FETCH_BOOKMARK, utiliza-se o valor do argumento FetchOffset em SQLFetchScroll . Se FetchOrientation for SQL_FETCH_BOOKMARK, o valor armazenado no endereço especificado pelo atributo da instrução SQL_ATTR_FETCH_BOOKMARK_PTR é utilizado. |
| RowCountPtr | O endereço especificado pelo atributo da declaração SQL_ATTR_ROWS_FETCHED_PTR. |
| RowStatusArray | O endereço especificado pelo atributo da declaração SQL_ATTR_ROW_STATUS_PTR. |
Para obter mais informações, consulte os cursores de bloqueio , cursores roláveis e compatibilidade com versões anteriores no Apêndice G: Diretrizes de motorista para compatibilidade com versões anteriores.
Descriptors e SQLFetchScroll
O SQLFetchScroll interage com os descritores da mesma forma que o SQLFetch. Para mais informações, consulte a secção "Descriptors and SQLFetchScroll" na Função SQLFetch.
Exemplo de código
Veja Column-Wise vinculação, Row-Wise vinculação, instruções de atualização e eliminação posicionadas, e atualização de linhas no conjunto de linhas com SQLSetPos.
Funções relacionadas
| Para obter informações sobre | Veja |
|---|---|
| Ligar um buffer a uma coluna num conjunto de resultados | Função SQLBindCol |
| Realização de operações de inserção, atualização ou eliminação em massa | Função SQLBulkOperations |
| Cancelamento do processamento de extratos | Função SQLCancel |
| Devolver informação sobre uma coluna num conjunto de resultados | Função SQLDescribeCol |
| Execução de uma instrução SQL | Função SQLExecDirect |
| Execução de uma instrução SQL preparada | Função SQLExecute |
| Obter uma única linha ou um bloco de dados numa direção apenas direta | Função SQLFetch |
| Fechar o cursor da instrução | Função SQLFreeStmt |
| Devolvendo o número de colunas do conjunto de resultados | Função SQLNumResultCols |
| Posicionamento do cursor, atualização dos dados no conjunto de linhas, ou atualização ou eliminação de dados no conjunto de resultados | Função SQLSetPos |
| Definir um atributo de instrução | Função SQLSetStmtAttr |