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: Conformidade com as Normas ODBC 1.0: Open Group
Summary
SQLSpecialColumns recupera a seguinte informação sobre colunas dentro de uma tabela especificada:
O conjunto ótimo de colunas que identifica de forma única uma linha na tabela.
Colunas que são automaticamente atualizadas quando qualquer valor na linha é atualizado por uma transação.
Syntax
SQLRETURN SQLSpecialColumns(
SQLHSTMT StatementHandle,
SQLSMALLINT IdentifierType,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLSMALLINT Scope,
SQLSMALLINT Nullable);
Arguments
HandleStatement
[Entrada] Identificador do extrato.
IdentifierType
[Entrada] Tipo de coluna para devolver. Deve ser um dos seguintes valores:
SQL_BEST_ROWID: Devolve a coluna ou conjunto ótimo de colunas que, ao recuperar valores da ou das colunas, permite identificar de forma única qualquer linha na tabela especificada. Uma coluna pode ser uma pseudo-coluna especificamente concebida para este fim (como no Oracle ROWID ou Ingres TID) ou a coluna ou colunas de qualquer índice único para a tabela.
SQL_ROWVER: Devolve a coluna ou colunas na tabela especificada, se existirem, que são automaticamente atualizadas pela fonte de dados quando qualquer valor na linha é atualizado por qualquer transação (como no SQLBase ROWID ou Sybase TIMESTAMP).
Nome do Catálogo
[Entrada] Nome do catálogo para a mesa. Se um driver suporta catálogos para algumas tabelas mas não para outras, como quando o driver recupera dados de diferentes SGBD, uma string vazia ("") indica as tabelas que não têm catálogos.
O CatalogName não pode conter um padrão de pesquisa em cadeia de caracteres.
Se o atributo da instrução SQL_ATTR_METADATA_ID estiver definido como SQL_TRUE, CatalogName é tratado como identificador e o seu caso não é significativo. Se for SQL_FALSE, Nome do Catálogo é um argumento comum; É tratado literalmente, e o seu caso é significativo. Para mais informações, consulte Argumentos em Funções de Catálogo.
NomeComprimento1
[Entrada] Comprimento em caracteres de *NomeDeCatálogo.
Nome do esquema
[Entrada] Nome do esquema para a tabela. Se um driver suportar esquemas para algumas tabelas mas não para outras, como quando o driver recupera dados de diferentes SGBD, uma cadeia vazia ("") denota as tabelas que não têm esquemas.
O Nome do Esquema não pode conter um padrão de pesquisa de cadeias de caracteres.
Se o atributo da instrução SQL_ATTR_METADATA_ID estiver definido como SQL_TRUE, SchemaName é tratado como identificador e o seu caso não é significativo. Se for SQL_FALSE, Nome-Esquema é um argumento comum; É tratado literalmente, e o seu caso é significativo.
NomeComprimento2
[Entrada] Comprimento em caracteres de *NomeEsquema.
TableName
[Entrada] Nome da mesa. Este argumento não pode ser um ponto nulo.
O TableName não pode conter um padrão de pesquisa de strings.
Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, TableName é tratado como identificador e o seu caso não é significativo. Se for SQL_FALSE, TableName é um argumento comum; É tratado literalmente, e o seu caso é significativo.
NomeComprimento3
[Entrada] Comprimento em caracteres de *NomeTabela.
Scope
[Entrada] Âmbito mínimo exigido do rowid. O rowid regressado pode ser de maior dimensão. Deve ser uma das seguintes opções:
SQL_SCOPE_CURROW: O rowid é garantido válido apenas enquanto estiver posicionado nessa fila. Uma reseleção posterior usando rowid pode não devolver uma linha se a linha foi atualizada ou eliminada por outra transação.
SQL_SCOPE_TRANSACTION: O rowid é garantido válido durante toda a transação em andamento.
SQL_SCOPE_SESSION: O rowid é garantido válido durante toda a duração da sessão (através dos limites das transações).
Anulável
[Entrada] Determina se deve devolver colunas especiais que podem ter um valor NULL. Deve ser uma das seguintes opções:
SQL_NO_NULLS: Excluir colunas especiais que possam ter valores NULL. Alguns drivers não conseguem suportar SQL_NO_NULLS, e estes drivers devolverão um conjunto de resultados vazio se SQL_NO_NULLS for especificado. As candidaturas devem ser preparadas para este caso e pedir SQL_NO_NULLS apenas se for absolutamente necessário.
SQL_NULLABLE: Devolver colunas especiais mesmo que possam ter valores NULL.
Devoluções
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.
Diagnósticos
Quando SQLSpecialColumns retorna SQL_ERROR ou SQL_SUCCESS_WITH_INFO, pode ser obtido um valor SQLSTATE associado chamando SQLGetDiagRec com um HandleType de SQL_HANDLE_STMT e um Handle de StatementHandle. A tabela seguinte lista os valores SQLSTATE normalmente devolvidos pelo SQLSpecialColumns 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.
| SQLSTATE | Erro | Description |
|---|---|---|
| 01000 | Aviso geral | Mensagem informativa específica para o condutor. (Função devolve SQL_SUCCESS_WITH_INFO.) |
| 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. |
| 24000 | Estado do cursor inválido | Um cursor estava aberto no StatementHandle, e SQLFetch ou SQLFetchScroll tinham sido chamados. Este erro é devolvido pelo Gestor de Drivers se SQLFetch ou SQLFetchScroll não tiverem devolvido SQL_NO_DATA e é devolvido pelo driver se SQLFetch ou SQLFetchScroll tiverem devolvido SQL_NO_DATA. Um cursor estava aberto no StatementHandle, mas SQLFetch ou SQLFetchScroll não tinham sido chamados. |
| 40001 | Falha de serialização | A transação foi revertida devido a um bloqueio de recursos com outra transação. |
| 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. |
| HY009 | Uso inválido do ponteiro nulo | O argumento TableName era um ponteiro nulo. O atributo da instrução SQL_ATTR_METADATA_ID foi definido como SQL_TRUE, o argumento CatalogName era um ponteiro nulo, e o SQL_CATALOG_NAME InfoType devolve que os nomes de catálogo são suportados. (DM) O atributo da SQL_ATTR_METADATA_ID instrução foi definido para SQL_TRUE, e o argumento SchemaName era um ponteiro nulo. |
| 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 ainda estava a ser executada quando o SQLSpecialColumns foi chamado. (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) 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. |
| 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 | (DM) O valor de um dos argumentos de comprimento era inferior a 0, mas não igual a SQL_NTS. O valor de um dos argumentos de comprimento excedia o valor máximo de comprimento para o nome correspondente. O comprimento máximo de cada nome pode ser obtido chamando SQLGetInfo com os valores do InfoType : SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN ou SQL_MAX_TABLE_NAME_LEN. |
| HY097 | Tipo de coluna fora do alcance | (DM) Foi especificado um valor IdentifierType inválido. |
| HY098 | Tipo de mira fora do alcance | (DM) Foi especificado um valor de Scope inválido. |
| HY099 | Tipo anulável fora do alcance | (DM) Foi especificado um valor Nullable inválido. |
| 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 | Foi especificado um catálogo, e o driver ou fonte de dados não suporta catálogos. Foi especificado um esquema, e o driver ou fonte de dados não suporta esquemas. A combinação das definições atuais dos atributos SQL_ATTR_CONCURRENCY e SQL_ATTR_CURSOR_TYPE da instrução não era suportada pelo driver ou pela fonte de dados. O atributo da instrução SQL_ATTR_USE_BOOKMARKS foi definido para SQL_UB_VARIABLE, e o atributo da instrução SQL_ATTR_CURSOR_TYPE foi definido para um tipo de cursor para o qual o driver não suporta favoritos. |
| 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
Quando o argumento IdentifierType está SQL_BEST_ROWID, SQLSpecialColumns devolve a coluna ou colunas que identificam de forma única cada linha da tabela. Estas colunas podem sempre ser usadas numa cláusula select-list ou WHERE . O SQLColumns, que é usado para devolver uma variedade de informação nas colunas de uma tabela, não retorna necessariamente as colunas que identificam unicamente cada linha, nem as colunas que são automaticamente atualizadas quando qualquer valor na linha é atualizado por uma transação. Por exemplo, o SQLColumns pode não devolver a pseudo-coluna Oracle ROWID. É por isso que o SQLSpecialColumns é usado para devolver estas colunas. Para mais informações, consulte Utilizações dos Dados de Catálogo.
Note
Para mais informações sobre o uso geral, argumentos e dados devolvidos das funções de catálogo ODBC, consulte Funções de Catálogo.
Se não existirem colunas que identifiquem unicamente cada linha da tabela, o SQLSpecialColumns devolve um conjunto de linhas sem linhas; uma chamada subsequente para SQLFetch ou SQLFetchScroll na instrução retorna SQL_NO_DATA.
Se os argumentos IdentifierType, Scope ou Nullable especificarem características que não são suportadas pela fonte de dados, SQLSpecialColumns devolve um conjunto de resultados vazio.
Se o atributo da SQL_ATTR_METADATA_ID for definido como SQL_TRUE, os argumentos CatalogName, SchemaName e TableName são tratados como identificadores, pelo que não podem ser definidos como um ponteiro nulo em certas situações. (Para mais informações, veja Argumentos em Funções de Catálogo.)
O SQLSpecialColumns devolve os resultados como um conjunto padrão de resultados, ordenado por SCOPE.
As colunas seguintes foram renomeadas para ODBC 3.x. As alterações no nome das colunas não afetam a compatibilidade retroativa porque as aplicações associam por número de coluna.
| Coluna ODBC 2.0 | Coluna ODBC 3.x |
|---|---|
| PRECISÃO | TAMANHO_DA_COLUNA |
| LENGTH | BUFFER_LENGTH |
| ESCALA | DÍGITOS_DECIMAIS |
Para determinar o comprimento real da coluna COLUMN_NAME, uma aplicação pode chamar SQLGetInfo com a opção SQL_MAX_COLUMN_NAME_LEN.
A tabela seguinte lista as colunas do conjunto de resultados. Colunas adicionais para além da coluna 8 (PSEUDO_COLUMN) podem ser definidas pelo driver. Uma aplicação deve aceder a colunas específicas do driver contando a partir do final do conjunto de resultados, em vez de especificar uma posição ordinal explícita. Para mais informações, consulte Dados Devolvidos por Funções de Catálogo.
| Nome da coluna | Número da coluna | Tipo de dados | Comments |
|---|---|---|---|
| SCOPE (ODBC 1.0) | 1 | Smallint | A dimensão real do tumulto. Contém um dos seguintes valores: SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION NULL é devolvido quando o IdentifierType está SQL_ROWVER. Para uma descrição de cada valor, consulte a descrição do Scope em "Syntax", anteriormente nesta secção. |
| COLUMN_NAME (ODBC 1.0) | 2 | Varchar não NULL | Nome da coluna. O driver devolve uma cadeia vazia para uma coluna que não tem nome. |
| DATA_TYPE (ODBC 1.0) | 3 | Smallint not NULL | Tipo de dados SQL. Isto pode ser um tipo de dado SQL ODBC ou um tipo de dado SQL específico do driver. Para uma lista de tipos de dados SQL ODBC válidos, consulte Tipos de Dados SQL. Para informações sobre tipos de dados SQL específicos de cada driver, consulte a documentação do driver. |
| TYPE_NAME (ODBC 1.0) | 4 | Varchar não NULL | Nome do tipo de dados dependente da fonte de dados; por exemplo, "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" ou "CHAR ( ) FOR BIT DATA". |
| COLUMN_SIZE (ODBC 1.0) | 5 | Integer | O tamanho da coluna na fonte de dados. Para mais informações sobre o tamanho da coluna, consulte Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho do Ecrã. |
| BUFFER_LENGTH (ODBC 1.0) | 6 | Integer | O comprimento em bytes de dados transferidos em um SQLGetData ou operação SQLFetch se SQL_C_DEFAULT for especificado. Para dados numéricos, esse tamanho pode ser diferente do tamanho dos dados armazenados na fonte de dados. Este valor pode diferir de COLUMN_SIZE coluna para dados de caracteres. Para mais informações, consulte Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho do Ecrã. |
| DECIMAL_DIGITS (ODBC 1.0) | 7 | Smallint | Os dígitos decimais da coluna na fonte de dados. NULL é devolvido para tipos de dados onde os dígitos decimais não são aplicáveis. Para mais informações sobre dígitos decimais, consulte Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho do Ecrã. |
| PSEUDO_COLUMN (ODBC 2.0) | 8 | Smallint | Indica se a coluna é uma pseudo-coluna, como Oracle ROWID: SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO Nota: Para máxima interoperabilidade, as pseudo-colunas não devem ser citadas com o carácter de aspas do identificador devolvido pelo SQLGetInfo. |
Depois de a aplicação recuperar valores para SQL_BEST_ROWID, pode usar esses valores para voltar a selecionar essa linha dentro do âmbito definido. A instrução SELECT garante que não devolve nenhuma linha ou uma linha.
Se uma aplicação reselecionar uma linha com base na coluna rowid ou colunas e a linha não for encontrada, a aplicação pode assumir que a linha foi eliminada ou que as colunas rowid foram modificadas. O oposto não é verdade: mesmo que o rowid não tenha mudado, as outras colunas da linha podem ter mudado.
As colunas retornadas para o tipo de coluna SQL_BEST_ROWID são úteis para aplicações que precisam de avançar e voltar dentro de um conjunto de resultados para obter os dados mais recentes de um conjunto de linhas. A coluna ou colunas do rowid garantem que não mudam enquanto estão posicionadas nessa linha.
A coluna ou colunas do rowid podem permanecer válidas mesmo quando o cursor não está posicionado na linha; a aplicação pode determinar isto verificando a coluna SCOPE no conjunto de resultados.
As colunas retornadas para o tipo de coluna SQL_ROWVER são úteis para aplicações que necessitam da capacidade de verificar se alguma coluna numa dada linha foi atualizada enquanto a linha foi reselecionada usando o rowid. Por exemplo, após selecionar novamente uma linha usando rowid, a aplicação pode comparar os valores anteriores nas colunas SQL_ROWVER com os que acabaram de ser obtidos. Se o valor numa coluna de SQL_ROWVER diferir do valor anterior, a aplicação pode alertar o utilizador de que os dados no ecrã mudaram.
Exemplo de código
Para um exemplo de código de uma função semelhante, veja SQLColumns.
Funções relacionadas
| Para obter informações sobre | Veja |
|---|---|
| Ligar um buffer a uma coluna num conjunto de resultados | Função SQLBindCol |
| Cancelamento do processamento de extratos | Função SQLCancel |
| Devolver as colunas numa tabela ou tabelas | Função SQLColumns |
| Obter uma única linha ou um bloco de dados numa direção apenas direta | Função SQLFetch |
| Buscar um bloco de dados ou percorrer um conjunto de resultados | Função SQLFetchScroll |
| Devolver as colunas de uma chave primária | Função SQLPrimaryKeys |