SQLSpecialColumns 関数

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

Summary
SQLSpecialColumns は、指定されたテーブル内の列に関する以下の情報を取得します:

  • テーブル内の行を一意に識別する最適な列の集合。

  • トランザクションによって行内の任意の値が更新されると自動的に更新される列です。

構文

  
SQLRETURN SQLSpecialColumns(  
     SQLHSTMT      StatementHandle,  
     SQLSMALLINT   IdentifierType,  
     SQLCHAR *     CatalogName,  
     SQLSMALLINT   NameLength1,  
     SQLCHAR *     SchemaName,  
     SQLSMALLINT   NameLength2,  
     SQLCHAR *     TableName,  
     SQLSMALLINT   NameLength3,  
     SQLSMALLINT   Scope,  
     SQLSMALLINT   Nullable);  

引数

StatementHandle
[入力]ステートメント ハンドル。

識別子タイプ
[入力]返すべき列の種類。 次のいずれかの値を指定する必要があります。

SQL_BEST_ROWID:指定されたテーブル内の任意の行を一意に識別できる最適な列または列の集合を返します。 カラムは、この目的のために特別に設計された擬似カラム(Oracle ROWIDやIngres TIDのように)か、テーブルの任意の一意インデックスのカラムまたはカラムのいずれかであったりします。

SQL_ROWVER:指定されたテーブル内のカラム(もしあれば)を返します。これらは、行内の任意の値がトランザクションによって更新された際にデータソースによって自動的に更新されます(例:SQLBase ROWIDやSybase TIMESTAMP)。

CatalogName
[入力]テーブルのカタログ名。 ドライバが一部のテーブルにはカタログをサポートしているが、他のテーブルではサポートしない場合(例えば異なるDBMSからデータを取得する場合など)、空文字列(「」)はカタログを持たないテーブルを示します。 CatalogNameは 文字列検索パターンを含めません。

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

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

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

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

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

テーブル名
[入力]テーブル名。 この引数はヌルポインタにはなり得ません。 TableNameは 文字列検索パターンを含めません。

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

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

Scope
[入力]ロウィドの最低限の必要範囲。 返却されたロイドはより広範な範囲を持つ可能性があります。 次のいずれかである必要があります。

SQL_SCOPE_CURROW:ロイドはその列に位置している間のみ有効であることが保証されます。 後でrowidを使って再選択しても、その行が他のトランザクションによって更新または削除された場合、その行が返ってこない場合があります。

SQL_SCOPE_TRANSACTION:ロイドは現在の取引期間中有効であることが保証されます。

SQL_SCOPE_SESSION:ロイドはセッション期間中(トランザクション境界を越えて)有効であることが保証されます。

ヌラブル
[入力]NULL値を持つ特別な列を返すかどうかを決定します。 次のいずれかである必要があります。

SQL_NO_NULLS: NULL値を持つ可能性のある特別な列を除外する。 一部のドライバーはSQL_NO_NULLSをサポートしず、SQL_NO_NULLS指定されると空の結果セットを返すこともあります。 申請書はこのケースに備え、絶対に必要な場合にのみSQL_NO_NULLSを申請してください。

SQL_NULLABLE:NULL値であっても特別な列を返すこと。

返品

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

Diagnostics

SQLSpecialColumnsがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、SQLGetDiagRecを呼び出し、HandleTypeをSQL_HANDLE_STMT、HandleStatementHandleで呼び出すことで関連するSQLSTATE値を取得できます。 以下の表は 、SQLSpecialColumns が一般的に返す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 ポインターの使用が無効です TableName 引数は null ポインターでした。

SQL_ATTR_METADATA_ID文属性はSQL_TRUEに設定され、 CatalogName の引数はnullポインタであり、SQL_CATALOG_NAME InfoType はカタログ名がサポートされていることを返します。

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

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

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

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

長さの引数のうち1つの値が対応する名前の最大長さ値を超えていました。 各名前の最大長さは、InfoTypeの値(SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN、またはSQL_MAX_TABLE_NAME_LEN)でSQLGetInfoを呼び出すことで得られます。
HY097 カラムタイプの範囲外 (DM) 無効な IdentifierType 値が指定されました。
HY098 スコープの種類が範囲外 (DM)無効な スコープ 値が指定されました。
HY099 無効型の範囲外 (DM) 無効な Nullable 値が指定されました。
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

IdentifierTypeの引数がSQL_BEST_ROWIDされると、SQLSpecialColumnsはテーブル内の各行を一意に識別する列を返します。 これらの列は常に select-list または WHERE 節で使用できます。 テーブルの列に関するさまざまな情報を返すために使われるSQLColumnsは、各行を一意に識別する列や、トランザクションによって行内の値が更新されると自動的に更新される列を必ずしも返すわけではありません。 例えば、 SQLColumn はOracle擬似カラムのROWIDを返さない場合があります。 このため、これらの列を返すために SQLSpecialColumns が使われています。 詳細については、「データ カタログの参照」を参照してください。

Note

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

テーブル内の各行を一意に識別する列がなければ、 SQLSpecialColumns は行のない行セットを返します。その後、 SQLFetch または SQLFetchScroll を呼び出して文を返すとSQL_NO_DATA返されます。

IdentifierTypeScope、またはNullableの引数がデータソースでサポートされていない特性を指定している場合、SQLSpecialColumnsは空の結果セットを返します。

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 CatalogNameSchemaNameTableName の引数は識別子として扱われるため、特定の状況でnullポインタに設定することはできません。 (詳細は「 カタログ関数の引数」を参照してください。)

SQLSpecialColumns は、SCOPE順に並べた標準結果セットとして結果を返します。

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

ODBC 2.0 列 ODBC 3.x
PRECISION COLUMN_SIZE
長さ BUFFER_LENGTH
規模 小数桁

COLUMN_NAME列の実際の長さを判定するために、アプリケーションはSQL_MAX_COLUMN_NAME_LENオプションで SQLGetInfo を呼び出すことができます。

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

列名 列番号 データの種類 Comments
SCOPE(ODBC 1.0) 1 Smallint ロウイドの実際の規模。 以下のいずれかの値を含む:

SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION

IdentifierTypeがSQL_ROWVERされるとNULLが返されます。 各値の説明については、この節の前半の「構文論」にある スコープ の説明を参照してください。
COLUMN_NAME(ODBC 1.0) 2 ヴァルチャーはNULLではありません 列名。 ドライバーは名前のない列に対して空文字列を返します。
DATA_TYPE(ODBC 1.0) 3 Smallint は NULL ではありません SQL データ型。 ODBC SQL データ型またはドライバー固有の SQL データ型を指定できます。 有効なODBC SQLデータ型の一覧については、 SQL Data Typesを参照してください。 ドライバー固有の SQL データ型の詳細については、ドライバーのドキュメントを参照してください。
TYPE_NAME(ODBC 1.0) 4 ヴァルチャーはNULLではありません データ ソースに依存するデータ型名。たとえば、"CHAR"、"VARCHAR"、"MONEY"、"LONG VARBINARY"、または "CHAR ( ) FOR BIT DATA" などです。
COLUMN_SIZE(ODBC 1.0) 5 Integer データソースの列の大きさ。 列サイズに関する詳細は、 列サイズ、小数点数、転送オクテット長、表示サイズをご覧ください。
BUFFER_LENGTH(ODBC 1.0) 6 Integer SQLGetData で転送されるデータの長さ (バイト単位)、または SQLFetch 操作 (SQL_C_DEFAULTが指定されている場合)。 数値データの場合、このサイズはデータ ソースに格納されているデータのサイズとは異なる場合があります。 この値は文字データの列COLUMN_SIZE異なる場合があります。 詳細は「 列サイズ、小数点数、転送オクテット長、表示サイズ」をご覧ください。
DECIMAL_DIGITS(ODBC 1.0) 7 Smallint データソース上の列の小数点以下の数字です。 NULLは、10進数桁が適用されないデータ型に対して返されます。 小数点数字に関する詳細は、列 サイズ、小数点数、転送オクテット長、表示サイズをご覧ください。
PSEUDO_COLUMN(ODBC 2.0) 8 Smallint 列が疑似列であるかどうかを示します。例えばOracle ROWIDです:

SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO 注: 最大の相互運用性のために、疑似カラムには SQLGetInfoが返す識別子の引用文字で引用してはいけません。

アプリケーションがSQL_BEST_ROWIDの値を取得した後、その値を用いて定義されたスコープ内でその行を再選択できます。 SELECT文は、行が全くないか、1行だけ返すことが保証されています。

もしアプリケーションが行の列を基に行を再選択しても行が見つからない場合、その行が削除されたか、行が変更されたと仮定できます。 逆は正しくありません。たとえロイドが変わっていなくても、その行の他の列は変わっている可能性があります。

列タイプSQL_BEST_ROWIDで返される列は、結果セット内で前後にスクロールして行から最新のデータを取得するアプリケーションに有用です。 ロウイドの列は、その行上に位置している間は変更されないことが保証されています。

行の列は、カーソルが行上に置かれていなくても有効のままである場合があります。アプリケーションは結果セット内のSCOPE列を確認することでこれを判別できます。

列タイプSQL_ROWVERで返される列は、行を行で再選択した際に特定の行の列が更新されたかどうかを確認する必要があるアプリケーションに役立ちます。 例えば、rowidを使って行を再選択した後、アプリケーションはSQL_ROWVER列の前の値と、取得した値を比較できます。 SQL_ROWVER列の値が前の値と異なる場合、アプリケーションは表示上のデータが変更されたことをユーザーに通知できます。

コード例

類似の関数のコード例については 、SQLColumnsを参照してください。

~についての情報 参照先
結果セット内の列へのバッファーのバインド SQLBindCol 関数
ステートメント処理の取り消し SQLCancel 関数
テーブルまたは複数のテーブルの列を返す SQLColumns 関数
順方向に単一行またはデータブロックを取得する方法 SQLFetch 関数
データブロックのフェッチまたは結果セットのスクロール SQLFetchScroll 関数
主キーの列を返す SQLPrimaryKeys 関数