Função SQLGetFunctions

Conformidade
Versão introduzida: ODBC 1.0 Conformidade com os padrões: ISO 92

Summary
O SQLGetFunctions retorna informações sobre se um driver suporta uma função ODBC específica. Essa função é implementada no Gerenciador de Drivers; Também pode ser implementado em drivers. Se um driver implementa SQLGetFunctions, o Gerenciador de Drivers chama a função no driver. Caso contrário, ela executa a função em si.

Sintaxe

  
SQLRETURN SQLGetFunctions(  
     SQLHDBC           ConnectionHandle,  
     SQLUSMALLINT      FunctionId,  
     SQLUSMALLINT *    SupportedPtr);  

Argumentos

Identificador de conexão
[Entrada] Identificador de conexão.

FunctionId
[Entrada] Um valor #define que identifica a função ODBC de interesse; SQL_API_ODBC3_ALL_FUNCTIONS orSQL_API_ALL_FUNCTIONS. SQL_API_ODBC3_ALL_FUNCTIONS é usado por uma aplicação ODBC 3*.x* para determinar o suporte a ODBC 3*.x* e funções anteriores. SQL_API_ALL_FUNCTIONS é usado por uma aplicação ODBC 2*.x* para determinar o suporte a funções ODBC 2*.x* e anteriores.

Para uma lista de valores de #define que identificam funções ODBC, veja as tabelas em "Comentários."

SuportadoPtr
[Saída] Se o FunctionId identificar uma única função ODBC, o SupportedPtr aponta para um único valor SQLUSMALLINT que é SQL_TRUE se a função especificada for suportada pelo driver, e SQL_FALSE se não for suportada.

Se o FunctionId for SQL_API_ODBC3_ALL_FUNCTIONS, o SupportedPtr aponta para um array SQLSMALLINT com um número de elementos igual a SQL_API_ODBC3_ALL_FUNCTIONS_SIZE. Esse array é tratado pelo Gerenciador de Drivers como um bitmap de 4.000 bits que pode ser usado para determinar se uma função ODBC 3*.x* ou anterior é suportada. A macro SQL_FUNC_EXISTS é chamada para determinar o suporte à função. (Veja "Comentários.") Uma aplicação ODBC 3*.x* pode chamar SQLGetFunctions com SQL_API_ODBC3_ALL_FUNCTIONS contra um driver ODBC 3*.x* ou ODBC 2*.x*.

Se o FunctionId estiver SQL_API_ALL_FUNCTIONS, o SupportedPtr aponta para um array SQLUSMALLINT de 100 elementos. O array é indexado por #define valores usados pelo FunctionId para identificar cada função ODBC; Alguns elementos do array ficam inutilizados e reservados para uso futuro. Um elemento é SQL_TRUE se identificar uma função ODBC 2*.x* ou anterior suportada pelo driver. É SQL_FALSE se identificar uma função ODBC não suportada pelo driver ou não identificar uma função ODBC.

Os arrays retornados em *SupportedPtr usam indexação baseada em zero.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR ou SQL_INVALID_HANDLE.

Diagnostics

Quando SQLGetFunctions retorna SQL_ERROR ou SQL_SUCCESS_WITH_INFO, um valor SQLSTATE associado pode ser obtido chamando SQLGetDiagRec com um HandleType de SQL_HANDLE_DBC e um Handle de ConnectionHandle. A tabela a seguir lista os valores SQLSTATE comumente retornados pelo SQLGetFunctions 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 DESCRIÇÃO
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.
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.
HY010 Erro de sequência de função (DM) SQLGetFunctions era chamado antes de SQLConnect, SQLBrowseConnect ou SQLDriverConnect.

(DM) SQLBrowseConnect foi chamado para o ConnectionHandle e retornou SQL_NEED_DATA. Essa função era chamada antes do SQLBrowseConnect retornar SQL_SUCCESS_WITH_INFO ou SQL_SUCCESS.

(DM) SQLExecute, SQLExecDirect ou SQLMoreResults era chamado para o ConnectionHandle e retornava SQL_PARAM_DATA_AVAILABLE. Essa função foi chamada antes que os dados fossem recuperados para todos os parâmetros transmitidos.
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.
HY095 Tipo de função fora do alcance (DM) Um valor inválido do FunctionId 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.
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.

Comments

SQLGetFunctions sempre retorna que SQLGetFunctions, SQLDataSources e SQLDrivers são suportados. Ele faz isso porque essas funções são implementadas no Gerenciador de Drivers. O Gerenciador de Drivers mapeará uma função ANSI para a função Unicode correspondente se a função Unicode existir e mapeará uma função Unicode para a função ANSI correspondente se a função ANSI existir. Para informações sobre como as aplicações utilizam SQLGetFunctions, veja Níveis de Conformidade da Interface.

A seguir está uma lista de valores válidos para o FunctionId para funções que cumprem o nível de conformidade com as normas ISO 92:

Valor FunctionId Valor FunctionId
SQL_API_SQLALLOCHANDLE SQL_API_SQLGETDESCFIELD
SQL_API_SQLBINDCOL SQL_API_SQLGETDESCREC
SQL_API_SQLCANCEL SQL_API_SQLGETDIAGFIELD
SQL_API_SQLCLOSECURSOR SQL_API_SQLGETDIAGREC
SQL_API_SQLCOLATTRIBUTE SQL_API_SQLGETENVATTR
SQL_API_SQLCONNECT SQL_API_SQLGETFUNCTIONS
SQL_API_SQLCOPYDESC SQL_API_SQLGETINFO
SQL_API_SQLDATASOURCES SQL_API_SQLGETSTMTATTR
SQL_API_SQLDESCRIBECOL SQL_API_SQLGETTYPEINFO
SQL_API_SQLDISCONNECT SQL_API_SQLNUMRESULTCOLS
SQL_API_SQLDRIVERS SQL_API_SQLPARAMDATA
SQL_API_SQLENDTRAN SQL_API_SQLPREPARE
SQL_API_SQLEXECDIRECT SQL_API_SQLPUTDATA
SQL_API_SQLEXECUTE SQL_API_SQLROWCOUNT
SQL_API_SQLFETCH SQL_API_SQLSETCONNECTATTR
SQL_API_SQLFETCHSCROLL SQL_API_SQLSETCURSORNAME
SQL_API_SQLFREEHANDLE SQL_API_SQLSETDESCFIELD
SQL_API_SQLFREESTMT SQL_API_SQLSETDESCREC
SQL_API_SQLGETCONNECTATTR SQL_API_SQLSETENVATTR
SQL_API_SQLGETCURSORNAME SQL_API_SQLSETSTMTATTR
SQL_API_SQLGETDATA

A seguir está uma lista de valores válidos para o FunctionId para funções que cumprem o nível de conformidade com os padrões do Open Group:

Valor FunctionId Valor FunctionId
SQL_API_SQLCOLUMNS SQL_API_SQLSTATISTICS
SQL_API_SQLSPECIALCOLUMNS SQL_API_SQLTABLES

A seguir está uma lista de valores válidos para o FunctionId para funções que estão em conformidade com o nível de conformidade com os padrões ODBC.

Valor FunctionId Valor FunctionId
SQL_API_SQLBINDPARAMETER SQL_API_SQLNATIVESQL
SQL_API_SQLBROWSECONNECT SQL_API_SQLNUMPARAMS
SQL_API_SQLBULKOPERATIONS[1] SQL_API_SQLPRIMARYKEYS
SQL_API_SQLCOLUMNPRIVILEGES SQL_API_SQLPROCEDURECOLUMNS
SQL_API_SQLDESCRIBEPARAM SQL_API_SQLPROCEDURES
SQL_API_SQLDRIVERCONNECT SQL_API_SQLSETPOS
SQL_API_SQLFOREIGNKEYS SQL_API_SQLTABLEPRIVILEGES
SQL_API_SQLMORERESULTS

[1] Ao trabalhar com um driver ODBC 2*.x*, SQLBulkOperations será retornado como suportado somente se ambos os seguintes pontos forem verdadeiros: o driver ODBC 2*.x* suporta SQLSetPos, e o tipo de informação SQL_POS_OPERATIONS retorna o bit SQL_POS_ADD como definido.

A seguir está uma lista de valores válidos para o FunctionId para funções introduzidas no ODBC 3.8 ou posterior:

Valor FunctionId
SQL_API_SQLCANCELHANDLE [2]

[2] SQLCancelHandle será retornado como suportado somente se o driver suportar tanto SQLCancel quanto SQLCancelHandle. Se o SQLCancel for suportado, mas o SQLCancelHandle não, a aplicação ainda pode chamar o SQLCancelHandle em um handle de instrução, pois ele será mapeado para SQLCancel.

SQL_FUNC_EXISTS Macro

A macro SQL_FUNC_EXISTS(SupportedPtr, FunctionID) é usada para determinar o suporte a ODBC 3*.x* ou funções anteriores após o SQLGetFunctions ter sido chamado com um argumento FunctionId de SQL_API_ODBC3_ALL_FUNCTIONS. A aplicação chama SQL_FUNC_EXISTS com o argumento SupportedPtr definido para o SupportedPtr passado em SQLGetFunctions, e com o argumento FunctionID definido para o #define da função. SQL_FUNC_EXISTS retorna SQL_TRUE se a função for suportada, e SQL_FALSE contrário.

Note

Ao trabalhar com um driver ODBC 2*.x*, o Gerenciador de Drivers ODBC 3*.x* retornará SQL_TRUE para SQLAllocHandle e SQLFreeHandle porque SQLAllocHandle é mapeado para SQLAllocEnv, SQLAllocConnect ou SQLAllocStmt, e porque SQLFreeHandle é mapeado para SQLFreeEnv, SQLFreeConnect ou SQLFreeStmt. No entanto, SQLAllocHandle ou SQLFreeHandle com argumento HandleType de SQL_HANDLE_DESC não é suportado, mesmo que SQL_TRUE seja retornado para as funções, pois não há uma função ODBC 2*.x* para mapear neste caso.

Exemplo de código

Os três exemplos a seguir mostram como uma aplicação usa SQLGetFunctions para determinar se um driver suporta SQLTables, SQLColumns e SQLStatistics. Se o driver não suportar essas funções, o aplicativo se desconecta do driver. O primeiro exemplo chama SQLGetFunctions uma vez para cada função.

SQLUSMALLINT TablesExists, ColumnsExists, StatisticsExists;  
RETCODE retcodeTables, retcodeColumns, retcodeStatistics  
  
retcodeTables = SQLGetFunctions(hdbc, SQL_API_SQLTABLES, &TablesExists);  
retcodeColumns = SQLGetFunctions(hdbc, SQL_API_SQLCOLUMNS, &ColumnsExists);  
retcodeStatistics = SQLGetFunctions(hdbc, SQL_API_SQLSTATISTICS, &StatisticsExists);  
  
// SQLGetFunctions is completed successfully and SQLTables, SQLColumns, and SQLStatistics are supported by the driver.  
if (retcodeTables == SQL_SUCCESS && TablesExists == SQL_TRUE &&   
retcodeColumns == SQL_SUCCESS && ColumnsExists == SQL_TRUE &&   
retcodeStatistics == SQL_SUCCESS && StatisticsExists == SQL_TRUE)   
{  
  
   // Continue with application  
  
}  
  
SQLDisconnect(hdbc);  

No segundo exemplo, uma aplicação ODBC 3.x chama SQLGetFunctions e passa a ela um array no qual SQLGetFunctions retorna informações sobre todas as funções ODBC 3.x e anteriores.

RETCODE retcodeTables, retcodeColumns, retcodeStatistics  
SQLUSMALLINT fExists[SQL_API_ODBC3_ALL_FUNCTIONS_SIZE];  
  
retcode = SQLGetFunctions(hdbc, SQL_API_ODBC3_ALL_FUNCTIONS, fExists);  
  
// SQLGetFunctions is completed successfully and SQLTables, SQLColumns, and SQLStatistics are supported by the driver.  
if (retcode == SQL_SUCCESS &&   
SQL_FUNC_EXISTS(fExists, SQL_API_SQLTABLES) == SQL_TRUE &&  
   SQL_FUNC_EXISTS(fExists, SQL_API_SQLCOLUMNS) == SQL_TRUE &&  
   SQL_FUNC_EXISTS(fExists, SQL_API_SQLSTATISTICS) == SQL_TRUE)   
{  
  
   // Continue with application  
  
}  
  
SQLDisconnect(hdbc);  

O terceiro exemplo é uma aplicação ODBC 2.x chamada SQLGetFunctions e passa a ele um array de 100 elementos no qual SQLGetFunctions retorna informações sobre todas as funções ODBC 2.x e anteriores.

#define FUNCTIONS 100  
  
RETCODE retcodeTables, retcodeColumns, retcodeStatistics  
SQLUSMALLINT fExists[FUNCTIONS];  
  
retcode = SQLGetFunctions(hdbc, SQL_API_ALL_FUNCTIONS, fExists);  
  
/* SQLGetFunctions is completed successfully and SQLTables, SQLColumns, and SQLStatistics are supported by the driver. */  
if (retcode == SQL_SUCCESS &&   
fExists[SQL_API_SQLTABLES] == SQL_TRUE &&  
   fExists[SQL_API_SQLCOLUMNS] == SQL_TRUE &&  
   fExists[SQL_API_SQLSTATISTICS] == SQL_TRUE)   
{  
  
   /* Continue with application */  
  
}  
  
SQLDisconnect(hdbc);  
Para obter informações sobre Veja
Retornando a configuração de um atributo de conexão Função SQLGetConnectAttr
Retornar informações sobre um driver ou fonte de dados Função SQLGetInfo
Retornando a configuração de um atributo de instrução Função SQLGetStmtAttr