Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Conformidade
Versão Introduzida: Conformidade com os Padrões ODBC 1.0: Open Group
Summary
SQLSpecialColumns recupera as seguintes informações 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 atualizadas automaticamente quando qualquer valor na linha é atualizado por uma transação.
Sintaxe
SQLRETURN SQLSpecialColumns(
SQLHSTMT StatementHandle,
SQLSMALLINT IdentifierType,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLSMALLINT Scope,
SQLSMALLINT Nullable);
Argumentos
Identificador de declaração
[Entrada] Identificador de instrução.
IdentifierType
[Entrada] Tipo de coluna para retornar. Deve ser um dos seguintes valores:
SQL_BEST_ROWID: Retorna a coluna ou conjunto ótimo de colunas que, ao recuperar valores da coluna ou colunas, permite que qualquer linha da tabela especificada seja identificada de forma única. Uma coluna pode ser tanto uma pseudo-coluna especificamente projetada para esse propósito (como no Oracle ROWID ou Ingres TID) quanto a coluna ou colunas de qualquer índice único para a tabela.
SQL_ROWVER: Retorna a coluna ou colunas na tabela especificada, se houver, 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).
Catalogname
[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 DBMSs, uma string vazia ("") denota aquelas tabelas que não possuem catálogos.
CatalogName não pode conter um padrão de busca em string.
Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, CatalogName é tratado como um identificador e seu caso não é significativo. Se for SQL_FALSE, Nome do Catálogo é um argumento comum; É tratado literalmente, e seu caso é significativo. Para obter mais informações, confira Argumentos em funções de catálogo.
NameLength1
[Entrada] Comprimento em caracteres de *NomeDeCatálogo.
Nome do esquema
[Entrada] Nome do esquema para a tabela. Se um driver suporta esquemas para algumas tabelas, mas não para outras, como quando o driver recupera dados de diferentes SGBDs, uma string vazia ("") denota aquelas tabelas que não possuem esquemas.
O NomeSchema não pode conter um padrão de busca em string.
Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, SchemaName é tratado como um identificador e seu caso não é significativo. Se for SQL_FALSE, NomeEsquema é um argumento comum; É tratado literalmente, e seu caso é significativo.
NameLength2
[Entrada] Comprimento em caracteres de *NomeEsquema.
TableName
[Entrada] Nome da tabela. Esse argumento não pode ser um ponto nulo.
TableName não pode conter um padrão de busca em cadeia de caracteres.
Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, TableName é tratado como um identificador e seu caso não é significativo. Se for SQL_FALSE, Nome da Tabela é um argumento comum; É tratado literalmente, e seu caso é significativo.
NameLength3
[Entrada] Comprimento em caracteres de *NomeTaula.
Scope
[Entrada] Escopo mínimo exigido do Rowid. O rowid retornado pode ter maior alcance. Deve ser um dos seguintes:
SQL_SCOPE_CURROW: O rowid é garantido válido apenas enquanto estiver posicionado naquela fileira. Uma reseleção posterior usando rowid pode não retornar uma linha se a linha foi atualizada ou excluída por outra transação.
SQL_SCOPE_TRANSACTION: O rowid é garantido válido durante toda a transação atual.
SQL_SCOPE_SESSION: O rowid é garantido válido durante toda a sessão (além dos limites das transações).
Anulável
[Entrada] Determina se deve retornar colunas especiais que podem ter valor NULL. Deve ser um dos seguintes:
SQL_NO_NULLS: Exclua colunas especiais que possam ter valores NULL. Alguns drivers não suportam SQL_NO_NULLS, e esses drivers retornam um conjunto de resultados vazio se SQL_NO_NULLS for especificado. As inscrições devem ser preparadas para este caso e solicitarem SQL_NO_NULLS apenas se for absolutamente necessário.
SQL_NULLABLE: Devolver colunas especiais mesmo que possam ter valores NULL.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.
Diagnostics
Quando SQLSpecialColumns retorna 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 a seguir lista os valores SQLSTATE comumente retornados pelo SQLSpecialColumns e explica cada um no contexto dessa função; a notação "(DM)" precede as descrições dos SQLSTATEs retornadas pelo Gerenciador de Drivers. O código de retorno associado a cada valor SQLSTATE é SQL_ERROR, a menos que indicado de outra forma.
| SQLSTATE | Erro | Description |
|---|---|---|
| 01000 | Aviso geral | Mensagem informativa específica do driver. (A função retorna SQL_SUCCESS_WITH_INFO.) |
| 08S01 | Falha no link de comunicação | O link de comunicação entre o driver e a fonte de dados à qual o driver estava conectado falhou antes que a função concluísse o processamento. |
| 24000 | Estado de cursor inválido | Um cursor estava aberto no StatementHandle, e SQLFetch ou SQLFetchScroll haviam sido chamados. Esse erro é retornado pelo Gerenciador de Drivers se SQLFetch ou SQLFetchScroll não tiverem retornado SQL_NO_DATA e é retornado pelo driver se SQLFetch ou SQLFetchScroll tiverem retornado SQL_NO_DATA. Um cursor estava aberto no StatementHandle, mas SQLFetch ou SQLFetchScroll não haviam sido chamados. |
| 40001 | Falha de serialização | A transação foi revertida devido a um deadlock de recursos com outra transação. |
| 40003 | Conclusão da instrução desconhecida | A conexão associada falhou durante a execução dessa função e o estado da transação não pode ser determinado. |
| HY000 | Erro geral | Ocorreu um erro para o qual não havia SQLSTATE específico e para o qual nenhum SQLSTATE específico da implementação foi definido. A mensagem de erro retornada por SQLGetDiagRec no buffer *MessageText descreve o erro e sua causa. |
| HY001 | Erro de alocação de memória | O driver não pôde alocar a memória necessária para dar suporte à execução ou conclusão da função. |
| HY008 | Operação cancelada | O processamento assíncrono foi habilitado para o StatementHandle. A função foi chamada e, antes de concluir a execução, SQLCancel ou SQLCancelHandle foi chamado no StatementHandle. Em seguida, a função foi chamada novamente no StatementHandle. A função foi chamada e, antes de concluir a execução, SQLCancel ou SQLCancelHandle foi chamado no StatementHandle de um thread diferente em um aplicativo multithread. |
| HY009 | Uso inválido de 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 retorna que nomes de catálogo são suportados. (DM) O atributo da instrução SQL_ATTR_METADATA_ID foi definido como SQL_TRUE, e o argumento SchemaName era um ponteiro nulo. |
| HY010 | Erro de sequência de função | (DM) Uma função de execução assíncrona foi chamada para o identificador de conexão associado ao StatementHandle. Essa função ainda estava em execução quando o SQLSpecialColumns foi chamado. (DM) SQLExecute, SQLExecDirect ou SQLMoreResults foi chamado para o StatementHandle e retornado SQL_PARAM_DATA_AVAILABLE. Essa função foi chamada antes que os dados fossem recuperados para todos os parâmetros transmitidos. (DM) Uma função de execução assíncrona (não esta) foi chamada para o StatementHandle e ainda estava em execução quando essa função foi chamada. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations ou SQLSetPos foi chamado para o StatementHandle e retornado SQL_NEED_DATA. Essa função foi chamada antes que os dados fossem enviados para todos os parâmetros ou colunas de dados em execução. |
| HY013 | Erro de gerenciamento de memória | A chamada de função não pôde ser processada porque os objetos de memória subjacentes não puderam ser acessados, possivelmente devido a condições de memória baixa. |
| HY090 | Cadeia de caracteres ou comprimento de buffer inválido | (DM) O valor de um dos argumentos de comprimento era menor que 0, mas não igual a SQL_NTS. O valor de um dos argumentos de comprimento excedeu 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) Um valor IdentifierType inválido foi especificado. |
| HY098 | Tipo de mira fora do alcance | (DM) Um valor de Escopo inválido foi especificado. |
| HY099 | Tipo anulável fora do alcance | (DM) Um valor Nullable inválido foi especificado. |
| HY117 | A conexão está suspensa devido ao estado desconhecido da transação. Somente funções de desconexão e somente leitura são permitidas. | (DM) Para obter mais informações sobre o estado suspenso, consulte Função SQLEndTran. |
| HYC00 | Recurso opcional não implementado | Um catálogo foi especificado, e o driver ou fonte de dados não suporta catálogos. Um esquema foi especificado, e o driver ou fonte de dados não suporta esquemas. A combinação das configurações atuais dos atributos de instrução SQL_ATTR_CONCURRENCY e SQL_ATTR_CURSOR_TYPE não era compatível com o driver ou a fonte de dados. O atributo de instrução SQL_ATTR_USE_BOOKMARKS foi definido como SQL_UB_VARIABLE e o atributo de instrução SQL_ATTR_CURSOR_TYPE foi definido como um tipo de cursor para o qual o driver não dá suporte a indicadores. |
| HYT00 | Tempo limite expirado | O período de tempo limite da consulta expirou antes da fonte de dados retornar o conjunto de resultados solicitado. O período de tempo limite é definido por meio de SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT. |
| HYT01 | O tempo limite da conexão expirou | O período de tempo limite da conexão expirou antes que a fonte de dados respondesse à solicitação. O período de tempo limite da conexão é definido por meio de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
| IM001 | O driver não suporta esta função | (DM) O driver associado ao StatementHandle não dá suporte à função. |
| IM017 | A sondagem está desabilitada no modo de notificação assíncrona | Sempre que o modelo de notificação é usado, a sondagem é desabilitada. |
| IM018 | SQLCompleteAsync não foi chamado para concluir a operação assíncrona anterior nesse identificador. | Se a chamada de função anterior no identificador retornar SQL_STILL_EXECUTING e se o modo de notificação estiver habilitado, SQLCompleteAsync deverá ser chamado no identificador para fazer o pós-processamento e concluir a operação. |
Comments
Quando o argumento IdentifierType está SQL_BEST_ROWID, SQLSpecialColumns retorna a(s) coluna ou colunas que identificam unicamente cada linha da tabela. Essas colunas podem sempre ser usadas em uma cláusula select-list ou WHERE . O SQLColumns, que é usado para retornar uma variedade de informações nas colunas de uma tabela, não necessariamente retorna as colunas que identificam unicamente cada linha, ou as colunas que são automaticamente atualizadas quando qualquer valor na linha é atualizado por uma transação. Por exemplo, SQLColumns pode não retornar o pseudo-coluna ROWID da Oracle. É por isso que o SQLSpecialColumns é usado para retornar essas colunas. Para obter mais informações, consulte Usos de dados de catálogo.
Note
Para obter mais informações sobre o uso geral, argumentos e dados retornados de funções de catálogo ODBC, consulte Funções de Catálogo.
Se não houver colunas que identifiquem unicamente cada linha da tabela, SQLSpecialColumns retorna 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 retorna um conjunto de resultados vazio.
Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, os argumentos CatalogName, SchemaName e TableName são tratados como identificadores, portanto não podem ser definidos como ponteiro nulo em certas situações. (Para mais informações, veja Argumentos em Funções de Catálogo.)
SQLSpecialColumns retorna os resultados como um conjunto padrão de resultados, ordenado por SCOPE.
As colunas a seguir foram renomeada para ODBC 3.x. As mudanças no nome das colunas não afetam a compatibilidade retroativa porque as aplicações são vinculadas por número de coluna.
| Coluna ODBC 2.0 | Coluna ODBC 3.x |
|---|---|
| PRECISION | TAMANHO_DA_COLUNA |
| COMPRIMENTO | 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 a seguir lista as colunas no conjunto de resultados. Colunas adicionais além da coluna 8 (PSEUDO_COLUMN) podem ser definidas pelo driver. Uma aplicação deve obter acesso a colunas específicas do driver contando regressivamente a partir do final do conjunto de resultados, em vez de especificar uma posição ordinal explícita. Para obter mais informações, consulte Dados Retornados por Funções de Catálogo.
| Nome da Coluna | Número da coluna | Tipo de dados | Comments |
|---|---|---|---|
| SCOPE (ODBC 1.0) | 1 | Smallint | O escopo real do Rowid. Contém um dos seguintes valores: SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION NULL é retornado quando o IdentifierType é SQL_ROWVER. Para uma descrição de cada valor, veja a descrição do Escopo em "Sintaxe", anteriormente nesta seção. |
| COLUMN_NAME (ODBC 1.0) | 2 | Varchar não é NULL | Nome da coluna. O driver retorna uma string vazia para uma coluna que não tem nome. |
| DATA_TYPE (ODBC 1.0) | 3 | Smallint não NULL | Tipo de dados SQL. Pode ser um tipo de dados SQL ODBC ou um tipo de dados SQL específico do driver. Para uma lista de tipos de dados válidos ODBC SQL, veja Tipos de Dados SQL. Para informações sobre tipos de dados SQL específicos do driver, confira 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, veja Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho da Exibição. |
| BUFFER_LENGTH (ODBC 1.0) | 6 | Integer | O comprimento em bytes de dados transferidos em uma operação SQLGetData ou 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. Esse valor pode diferir de COLUMN_SIZE coluna para dados de caracteres. Para mais informações, veja Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho da Exibição. |
| DECIMAL_DIGITS (ODBC 1.0) | 7 | Smallint | Os dígitos decimais da coluna na fonte de dados. NULL é retornado para tipos de dados onde dígitos decimais não são aplicáveis. Para mais informações sobre dígitos decimais, veja Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho da Exibição. |
| 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, pseudo-colunas não devem ser citadas com o caractere de aspas do identificador retornado pelo SQLGetInfo. |
Após a aplicação recuperar os valores para SQL_BEST_ROWID, pode usar esses valores para reselecionar essa linha dentro do escopo definido. A instrução SELECT garante que não retornará nenhuma linha ou uma linha.
Se uma aplicação reselecionar uma linha baseada na coluna ou colunas rowid e a linha não for encontrada, a aplicação pode assumir que a linha foi deletada 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.
Colunas retornadas para o tipo de coluna SQL_BEST_ROWID são úteis para aplicações que precisam rolar para frente e para trás dentro de um conjunto de resultados para recuperar os dados mais recentes de um conjunto de linhas. A coluna ou colunas do rowid garantem que não mudarão enquanto posicionadas naquela 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 isso verificando a coluna SCOPE no conjunto de resultados.
Colunas retornadas para o tipo de coluna SQL_ROWVER são úteis para aplicações que precisam da capacidade de verificar se alguma coluna em uma determinada linha foi atualizada enquanto a linha foi reselecionada usando o rowid. Por exemplo, após reselecionar uma linha usando rowid, o aplicativo pode comparar os valores anteriores nas colunas SQL_ROWVER com os que acabaram de buscar. Se o valor em uma coluna SQL_ROWVER diferir do valor anterior, o aplicativo pode alertar o usuário de que os dados na tela 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 |
|---|---|
| Associando um buffer a uma coluna em um conjunto de resultados | Função SQLBindCol |
| Cancelando o processamento de instruções | Função SQLCancel |
| Devolvendo as colunas em uma ou mais tabelas | Função SQLColumns |
| Buscar uma única linha ou um bloco de dados em direção apenas direta | Função SQLFetch |
| Buscando um bloco de dados ou rolando por um conjunto de resultados | Função SQLFetchScroll |
| Retornando as colunas de uma chave primária | Função SQLPrimaryKeys |