SQLTables 関数

適合 性
導入されたバージョン:ODBC 1.0 標準準拠:オープングループ

まとめ
SQLTables は、特定のデータソースに保存されたテーブル名、カタログ名、またはスキーマ名のリストとテーブル型を返します。 ドライバーは、結果セットとして情報を返します。

Syntax

  
SQLRETURN SQLTables(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      TableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      TableType,  
     SQLSMALLINT    NameLength4);  

引数

StatementHandle
[入力]検索結果のための文ハンドル。

CatalogName
[入力]カタログ名。 CatalogNameの引数は、SQL_ODBC_VERSION環境属性がSQL_OV_ODBC3であれば検索パターンを受け入れます。SQL_OV_ODBC2が設定されている場合、検索パターンは受け入れられません。 ドライバが一部のテーブルにはカタログをサポートしているが、他のテーブルには対応しない場合(例えば異なるDBMSからデータを取得する場合など)、空文字列(「」)はカタログを持たないテーブルを示します。

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 CatalogName は識別子として扱われ、その大文字は重要ではありません。 もしSQL_FALSEの場合、 CatalogName はパターン値の引数となります。文字通りに扱われており、そのケースは重要です。 詳細については、「カタログ関数の引数」を参照してください。

NameLength1
[入力]*カタログ名の文字数。

SchemaName
[入力]スキーマ名の文字列検索パターン。 ドライバが一部のテーブルにはスキーマをサポートしているが、他のテーブルには対応しない場合、例えば異なるDBMSからデータを取得する場合、空文字列(「」)はスキーマを持たないテーブルを示します。

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 SchemaName は識別子として扱われ、その大文字は重要ではありません。 SQL_FALSEの場合、 SchemaName はパターンの値の引数となります。文字通りに扱われており、そのケースは重要です。

NameLength2
[入力]*SchemaNameの文字数。

テーブル名
[入力]テーブル名の文字列検索パターン。

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 TableName は識別子として扱われ、その大文字は重要ではありません。 SQL_FALSEの場合、 TableName はパターン値の引数となります。文字通りに扱われており、そのケースは重要です。

NameLength3
[入力]*TableNameの文字数。

TableType
[入力]対応するテーブルの種類のリスト。

SQL_ATTR_METADATA_ID文属性は TableType の引数には影響しません。 TableType は、SQL_ATTR_METADATA_IDの設定に関わらず値リストの引数です。

名前の長さ4
[入力]*TableType.の文字数。

返品

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR、またはSQL_INVALID_HANDLE。

Diagnostics

SQLTablesがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、SQLGetDiagRecを呼び出し、HandleTypeをSQL_HANDLE_STMT、HandleStatementHandleで呼び出すことで関連するSQLSTATE値を取得できます。 以下の表は 、SQLTables が通常返すSQLSTATE値を一覧にし、この関数の文脈でそれぞれを説明します。「(DM)」という表記は、ドライバーマネージャーが返すSQLstateの記述の前に記載されます。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

SQLSTATE エラー Description
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
08S01 通信リンクエラー ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。
24000 カーソル状態が無効 StatementHandle上のカーソルが開かれ、SQLFetchまたはSQLFetchScrollが呼び出されていました。 このエラーは、SQLFetchまたはSQLFetchScrollが返SQL_NO_DATA返さない場合、ドライバーから返SQL_NO_DATA返されます。

StatementHandleにはカーソルが開かれていましたが、SQLFetchSQLFetchScrollは呼び出されていませんでした。
40001 シリアル化エラー リソースが別のトランザクションとデッドロックしたため、トランザクションがロールバックされました。
40003 ステートメントの入力候補が不明です この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。
HY008 操作が取り消されました StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandleStatementHandle で呼び出されました。 その後、 StatementHandle で関数が再度呼び出されました。

関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。
HY009 null ポインターの使用が無効です SQL_ATTR_METADATA_ID文属性はSQL_TRUEに設定され、 CatalogName の引数はnullポインタであり、SQL_CATALOG_NAME InfoType はカタログ名がサポートされていることを返します。

(DM) SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定され、 SchemaName または TableName の引数はnullポインタでした。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数はSQLTablesが呼び出された時点でも実行中でした。

(DM) SQLExecuteSQLExecDirect、または SQLMoreResultsStatementHandle が呼び出され、SQL_PARAM_DATA_AVAILABLEが返されました。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。

(DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出されこの関数が呼び出されたときにはまだ実行されていました。

(DM) SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPosStatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY090 文字列またはバッファーの長さが無効です (DM) 長さの引数のうち1つの値は0未満であったがSQL_NTSに等しくなかった。

名前の長さの引数のいずれかの値が、対応する名前の最大長の値を超えました。
HY117 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。
HYC00 省略可能な機能が実装されていません カタログが指定されており、ドライバーやデータソースはカタログをサポートしていません。

スキーマが指定され、ドライバーやデータソースはスキーマをサポートしていません。

カタログ名、テーブルスキーマ、またはテーブル名に対して文字列検索パターンが指定されており、データソースはこれらの引数の一つ以上の検索パターンをサポートしていません。

SQL_ATTR_CONCURRENCY属性とSQL_ATTR_CURSOR_TYPE ステートメント属性の現在の設定の組み合わせは、ドライバーまたはデータ ソースではサポートされていませんでした。

SQL_ATTR_USE_BOOKMARKS ステートメント属性はSQL_UB_VARIABLEに設定され、SQL_ATTR_CURSOR_TYPE ステートメント属性は、ドライバーがブックマークをサポートしていないカーソルの種類に設定されました。
HYT00 タイムアウトの期限が切れました データ ソースが要求された結果セットを返す前に、クエリのタイムアウト期間の有効期限が切れています。 タイムアウト期間は、SQL_ATTR_QUERY_TIMEOUT SQLSetStmtAttr によって設定されます。
HYT01 接続がタイムアウトしました データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。
IM017 非同期通知モードでポーリングが無効になっている 通知モデルが使用されるたびに、ポーリングは無効になります。
IM018 SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、後処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。

Comments

SQLTables は要求範囲内のすべてのテーブルを一覧にします。 ユーザーはこれらのテーブルのいずれかに対してSELECT権限を持つ場合もあれば、持たない場合もあります。 アクセシビリティを確認するために、アプリケーションは以下を行えます:

  • SQLGetInfoに電話してSQL_ACCESSIBLE_TABLES情報タイプを確認してください。

  • SQLTablePrivilegesを呼び出して、各テーブルの権限を確認してください。

そうでなければ、ユーザーが SELECT 権限が付与されていないテーブルを選択する状況を処理できる必要があります。

SchemaNameTableNameの引数は検索パターンを受け入れます。 CatalogNameの引数は、SQL_ODBC_VERSION環境属性がSQL_OV_ODBC3であれば検索パターンを受け入れます。SQL_OV_ODBC2が設定されている場合、検索パターンは受け入れられません。 SQL_OV_ODBC3が設定されている場合、ODBC 3*.x*ドライバーは CatalogName 引数内のワイルドカード文字を文字通りに扱うためにエスケープする必要があります。 有効な検索パターンの詳細については、「 パターン値引数」を参照してください。

Note

ODBC カタログ関数の一般的な使用方法、引数、および返されるデータの詳細については、「 カタログ関数」を参照してください。

カタログ、スキーマ、テーブルタイプの列挙をサポートするために、SQLTablesCatalogNameSchemaNameTableNameTableType引数に対して以下の特別な意味論が定義されています。

  • CatalogNameがSQL_ALL_CATALOGSで、SchemaNameTableNameが空文字列の場合、結果セットにはデータソースの有効なカタログのリストが含まれます。 (TABLE_CAT列を除くすべての列にNULLが含まれています。)

  • SchemaNameがSQL_ALL_SCHEMASでCatalogNameTableNameが空文字列の場合、結果セットにはデータソースの有効なスキーマのリストが含まれます。 (TABLE_SCHEM列を除くすべての列にはNULLが含まれています。)

  • TableTypeがSQL_ALL_TABLE_TYPESでCatalogNameSchemaNameTableNameが空文字列の場合、結果セットにはデータソースの有効なテーブルタイプの一覧が含まれます。 (TABLE_TYPE列を除くすべての列にはNULLが含まれています。)

TableTypeが空文字列でない場合、関心のあるタイプのカンマ区切られた値のリストを含まなければなりません。各値は単引用符(')で囲むことも、引用符なしで囲むこともできます。例えば「TABLE」「VIEW」、TABLE、VIEW。 アプリケーションは常にテーブルタイプを大文字で指定すべきです。ドライバーはデータソースが必要とするケースにテーブル型を変換すべきです。 データソースが指定されたテーブルタイプをサポートしていない場合、 SQLTables はそのタイプについて結果を返しません。

SQLTables は、TABLE_TYPE、TABLE_CAT、TABLE_SCHEM、TABLE_NAME順に並べた標準結果セットとして結果を返します。 この情報の使用方法については、「 カタログ データの使用」を参照してください。

TABLE_CAT、TABLE_SCHEM、TABLE_NAMEの各カラムの実際の長さを決定するために、アプリケーションはSQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN、SQL_MAX_TABLE_NAME_LENの情報型で SQLGetInfo を呼び出すことができます。

以下の列はODBC 3*.x*に改名されています。 カラム名の変更は後方互換性には影響しません。なぜならアプリケーションはカラム番号でバインドするからです。

ODBC 2.0 列 ODBC 3*.x*欄
TABLE_QUALIFIER TABLE_CAT
テーブルの所有者 TABLE_SCHEM

次の表に、結果セットの列を示します。 5列目以降の追加列(REMARKS)はドライバーによって定義可能です。 アプリケーションは、明示的な序数位置を指定するのではなく、結果セットの末尾からカウントダウンすることで、ドライバー固有の列にアクセスできるようにする必要があります。 詳細については、「 カタログ関数によって返されるデータ」を参照してください。

列名 列番号 データの種類 Comments
TABLE_CAT(ODBC 1.0) 1 Varchar カタログ名;データソースに適用できない場合はNULLです。 ドライバが一部のテーブルにはカタログをサポートしているが、他のテーブルではサポートしない場合(例えば異なるDBMSからデータを取得する場合など)、カタログを持たないテーブルに対して空の文字列("")を返します。
TABLE_SCHEM(ODBC 1.0) 2 Varchar スキーマ名;データソースに適用できない場合はNULLです。 ドライバが一部のテーブルにはスキーマをサポートしているが、他のテーブルではサポートしない場合、例えば異なるDBMSからデータを取得する場合、スキーマを持たないテーブルに対して空の文字列("")を返します。
TABLE_NAME(ODBC 1.0) 3 Varchar テーブル名。
TABLE_TYPE(ODBC 1.0) 4 Varchar テーブルタイプ名;以下のいずれか:「TABLE」「VIEW」「システム TABLE」「グローバル一時的」「ローカル一時」「別名」「SYNONYM」、またはデータソース固有のタイプ名のいずれかです。

「ALIAS」と「SYNONYM」の意味はドライバーごとに異なります。
備考(ODBC 1.0) 5 Varchar テーブルの説明。

Example

以下のサンプルコードはハンドルや接続を解放しません。 コードサンプルから自由なハンドルや文については 、SQLFreeHandle Function および SQLFreeStmt Function を参照してください。

// SQLTables.cpp  
// compile with: user32.lib odbc32.lib  
#include <windows.h>  
#include <sqlext.h>  
#include <strsafe.h>  
  
// simple helper functions  
int MySQLSuccess(SQLRETURN rc) {  
   return (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO);  
}  
  
struct DataBinding {  
   SQLSMALLINT TargetType;  
   SQLPOINTER TargetValuePtr;  
   SQLINTEGER BufferLength;  
   SQLLEN StrLen_or_Ind;  
};  
  
void printCatalog(const struct DataBinding* catalogResult) {  
   if (catalogResult[0].StrLen_or_Ind != SQL_NULL_DATA)   
      printf("Catalog Name = %s\n", (char *)catalogResult[0].TargetValuePtr);  
}  
  
// remember to disconnect and free memory, and free statements and handles  
int main() {  
   int bufferSize = 1024, i, numCols = 5;  
   struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );  
   wchar_t* dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );  
   wchar_t* userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );  
  
   // declare and initialize the environment, connection, statement handles  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   SQLRETURN retCode;  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLWCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen;  
  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, (SQLCHAR*)"Driver={SQL Server}", SQL_NTS, (SQLCHAR*)connStrbuffer, 1024 + 1, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
   retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferSize);  
   retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferSize);  
  
   bufferSize = 1024;  
  
   // allocate memory for the binding  
   // free this memory when done  
   for ( i = 0 ; i < numCols ; i++ ) {  
      catalogResult[i].TargetType = SQL_C_CHAR;  
      catalogResult[i].BufferLength = (bufferSize + 1);  
      catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );  
   }  
  
   // setup the binding (can be used even if the statement is closed by closeStatementHandle)  
   for ( i = 0 ; i < numCols ; i++ )  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));  
  
   // all catalogs query  
   printf( "A list of names of all catalogs\n" );  
   retCode = SQLTables( hstmt, (SQLCHAR*)SQL_ALL_CATALOGS, SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS );  
   for ( retCode = SQLFetch(hstmt) ;  MySQLSuccess(retCode) ; retCode = SQLFetch(hstmt) )  
      printCatalog( catalogResult );  
}  
詳細情報 参照先
結果セット内の列へのバッファーのバインド SQLBindCol 関数
ステートメント処理の取り消し SQLCancel 関数
コラムまたは複数のコラムの返還権限 SQLColumnPrivileges 関数
テーブルまたは複数のテーブルの列を返す SQLColumns 関数
順方向に単一行またはデータブロックを取得する方法 SQLFetch 関数
データブロックのフェッチまたは結果セットのスクロール SQLFetchScroll 関数
表の統計と指数の返還 SQLStatistics 関数
テーブルまたはテーブルの返品権限 SQLTablePrivileges 関数

こちらもご覧ください

ODBC API リファレンス
ODBC ヘッダー ファイル