仕様: | DB2 CLI 2.1 | ODBC 1.0 |
SQLForeignKeys() は、指定された表の外部キーに関する情報を返します。情報は SQL 結果セット内に返されますが、これは、照会で生成された結果を検索するのに使用される関数と同じ関数を使用して処理することができます。
構文
SQLRETURN SQLForeignKeys ( SQLHSTMT StatementHandle, /* hstmt */ SQLCHAR *FAR PKCatalogName, /* szPkCatalogName */ SQLSMALLINT NameLength1, /* cbPkCatalogName */ SQLCHAR *FAR PKSchemaName, /* szPkSchemaName */ SQLSMALLINT NameLength2, /* cbPkSchemaName */ SQLCHAR *FAR PKTableName, /* szPkTableName */ SQLSMALLINT NameLength3, /* cbPkTableName */ SQLCHAR *FAR FKCatalogName, /* szFkCatalogName */ SQLSMALLINT NameLength4, /* cbFkCatalogName */ SQLCHAR *FAR FKSchemaName, /* szFkSchemaName */ SQLSMALLINT NameLength5, /* cbFkSchemaName */ SQLCHAR *FAR FKTableName, /* szFkTableName */ SQLSMALLINT NameLength6); /* cbFkTableName */
関数引き数
データ・タイプ | 引き数 | 使用法 | 説明 |
---|---|---|---|
SQLHSTMT | StatementHandle | 入力 | ステートメント・ハンドル |
SQLCHAR * | PKCatalogName | 入力 | 基本キー表のカタログ修飾子。これは、NULL ポインターまたは長さゼロのストリングでなければなりません。 |
SQLSMALLINT | NameLength1 | 入力 | PKCatalogName の長さ。これは、0 に設定する必要があります。 |
SQLCHAR * | PKSchemaName | 入力 | 基本キー表のスキーマ修飾子。 |
SQLSMALLINT | NameLength2 | 入力 | PKSchemaName の長さ。 |
SQLCHAR * | PKTableName | 入力 | 基本キーを含む表名の名前。 |
SQLSMALLINT | NameLength3 | 入力 | PKTableName の長さ。 |
SQLCHAR * | FKCatalogName | 入力 | 外部キーを含む表のカタログ修飾子。これは、NULL ポインターまたは長さゼロのストリングでなければなりません。 |
SQLSMALLINT | NameLength4 | 入力 | FKCatalogName の長さ。これは、0 に設定する必要があります。 |
SQLCHAR * | FKSchemaName | 入力 | 外部キーを含む表のスキーマ修飾子。 |
SQLSMALLINT | NameLength5 | 入力 | FKSchemaName の長さ。 |
SQLCHAR * | FKTableName | 入力 | 外部キーを含む表の名前。 |
SQLSMALLINT | NameLength6 | 入力 | FKTableName の長さ。 |
使用法
PKTableName に表名が含まれており、 FKTableName が空ストリングである場合、 SQLForeignKeys() は指定された表の基本キーとその表を参照するすべての外部キー (他の表の中にある) を含む結果セットを返します。
FKTableName に表名が含まれており、 PKTableName が空ストリングである場合、 SQLForeignKeys() は指定された表のすべての外部キーとそれらのキーが参照する基本キー (他の表の中にある) を含む結果セットを返します。
PKTableName と FKTableName の両方に表名が含まれている場合、 SQLForeignKeys() は FKTableName で指定された表の外部キーを返しますが、これらの外部キーは PKTableName で指定された表の基本キーを参照します。これは、最大 1 つのキーでなければなりません。
表名に関連したスキーマ修飾子引き数を指定しないと、スキーマ名は現行の接続にとって現在有効であるものに省略時設定されます。
表 80 には、 SQLForeignKeys() 呼び出しで生成された結果セットの列をリストしています。基本キーに関連した外部キーを要求すると、結果セットは FKTABLE_CAT、FKTABLE_SCHEM、 FKTABLE_NAME、そして ORDINAL_POSITION の順序になります。外部キーに関連した基本キーが要求されると、結果セットは PKTABLE_CAT、PKTABLE_SCHEM、 PKTABLE_NAME、そして ORDINAL_POSITION の順序になります。
カタログ関数の結果セットの VARCHAR 列は、SQL92 の制限に従うように、 128 の最大長属性で宣言されています。 DB2 名は 128 より小さいため、アプリケーションは出力バッファー用に常に 128 文字 (にヌル終止符を加えたもの) を確保するようにしたり、あるいは、SQL_MAX_CATALOG_NAME_LEN、 SQL_MAX_SCHEMA_NAME_LEN、 SQL_MAX_TABLE_NAME_LEN、および SQL_MAX_COLUMN_NAME_LEN を指定して SQLGetInfo() を呼び出し、接続している DBMS でサポートされる関連付けられた TABLE_CAT、 TABLE_SCHEM、 TABLE_NAME、および COLUMN_NAME 列の実際の長さをそれぞれ判別することができます。
将来のリリースでは、列が新たに追加されたり、既存の列の名前が変更されたりする可能性はありますが、現行の列の位置が変更されることはありません。
列番号 / 名 | データ・タイプ | 説明 | ||
---|---|---|---|---|
1 PKTABLE_CAT | VARCHAR(128) | これは常に NULL です。 | ||
2 PKTABLE_SCHEM | VARCHAR(128) | PKTABLE_NAME を含むスキーマの名前。 | ||
3 PKTABLE_NAME | 非 NULL の VARCHAR(128) | 基本キーを含む表の名前。 | ||
4 PKCOLUMN_NAME | 非 NULL の VARCHAR(128) | 基本キー列名。 | ||
5 FKTABLE_CAT | VARCHAR(128) | これは常に NULL です。 | ||
6 FKTABLE_SCHEM | VARCHAR(128) | FKTABLE_NAME を含むスキーマの名前。 | ||
7 FKTABLE_NAME | 非 NULL の VARCHAR(128) | 外部キーを含む表の名前。 | ||
8 FKCOLUMN_NAME | 非 NULL の VARCHAR(128) | 外部キー列名。 | ||
9 ORDINAL_POSITION | 非 NULL の SMALLINT | 1 から始まるキー内の列の順序を示す位置。 | ||
10 UPDATE_RULE | SMALLINT | SQL 操作が UPDATE であるときに外部キーに適用されるアクション。
IBM DB2 DBMS の更新規則は、常に RESTRICT または SQL_NO_ACTION のいずれかです。しかし、ODBC アプリケーションは IBM 以外の DBMS に接続されると、以下の UPDATE_RULE 値を検出する場合があります。
| ||
11 DELETE_RULE | SMALLINT | SQL 操作が DELETE であるときに外部キーに適用されるアクション。
| ||
12 FK_NAME | VARCHAR(128) | 外部キー識別子。データに適用できない場合は、NULL。 | ||
13 PK_NAME | VARCHAR(128) | 基本キー識別子。データに適用できない場合は、NULL。 | ||
14 DEFERRABILITY | SMALLINT | 以下のいずれかです。
| ||
|
戻りコード
診断
SQLSTATE | 説明 | 解説 |
---|---|---|
24000 | カーソル状態が無効です。 | カーソルはすでに、ステートメント・ハンドル上にオープンされています。 |
40003 08S01 | 通信リンクに障害が起きました。 | アプリケーションとデータ・ソースとの間の通信リンクが、関数の完了する前に失敗しました。 |
HY001 | メモリーの割り振り失敗です。 | DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを割り振ることができません。 |
HY009 | 引き数値が無効です。 | 引き数 PKTableName と FKTableName はともにヌル・ポインターでした。 |
HY010 | 関数の順序エラーです。 |
実行時データ (SQLParamData()、SQLPutData()) 操作中に、関数が呼び出されました。 BEGIN COMPOUND と END COMPOUND SQL の操作中に、関数が呼び出されました。 非同期実行関数 (この関数ではない) が StatementHandle で呼び出され、この関数は、呼び出し時に依然実行中でした。
|
HY014 | もはやハンドルはありません。 | DB2 CLI は、内部資源が原因でハンドルを割り当てることができませんでした。 |
HY090 | ストリングまたはバッファー長が無効です。 | 名前の長さ引き数のうちの 1 つの値は 0 より小さい値でしたが、
SQL_NTS と等しくありませんでした。
表または所有者名の長さが、サーバーによってサポートされている最大長より長くなっています。 SQLGetInfo - 一般情報の入手を参照してください。 |
HYC00 | ドライバーが機能していません。 | DB2 CLI は、表名の修飾子としてカタログ をサポートしません。 |
HYT00 | タイムアウトになりました。 | データ・ソースが結果セットを返す前に、タイムアウト期間が満了しました。タイムアウトは、 Windows 3.1 や Macintosh System 7 のようなマルチタスクではないシステム上でのみサポートされています。タイムアウト期間は、 SQLSetConnectAttr() の SQL_ATTR_QUERY_TIMEOUT 属性を使用して設定することができます。 |
制約
なし。
(ここで完全サンプル tbconstr.c を使用することもできます 。)
/* From the CLI sample tbconstr.c */ /* ... */ /* fetch each row, and display */ printf(" Fetch each row and display.\n"); sqlrc = SQLFetch( hstmt );
参照