다음을 통해 공유


SQLForeignKeys 함수

규칙
도입된 버전: ODBC 1.0 표준 준수: ODBC

요약
SQLForeignKeys는 다음을 반환할 수 있습니다.

  • 지정한 테이블의 외대 키 목록입니다(다른 테이블의 기본 키를 참조하는 지정된 테이블의 열).

  • 지정된 테이블의 기본 키를 참조하는 다른 테이블의 외래 키 목록입니다.

드라이버는 지정된 문에 대한 결과 집합으로 각 목록을 반환합니다.

구문

  
SQLRETURN SQLForeignKeys(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      PKCatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      PKSchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      PKTableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      FKCatalogName,  
     SQLSMALLINT    NameLength4,  
     SQLCHAR *      FKSchemaName,  
     SQLSMALLINT    NameLength5,  
     SQLCHAR *      FKTableName,  
     SQLSMALLINT    NameLength6);  

인수

StatementHandle
[입력] 문 핸들입니다.

PKCatalogName
[입력] 기본 키 테이블 카탈로그 이름입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대해 카탈로그를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 빈 문자열("")은 카탈로그가 없는 테이블을 나타냅니다. PKCatalogName 은 문자열 검색 패턴을 포함할 수 없습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정된 경우 PKCatalogName 은 식별자로 처리되고 해당 사례는 중요하지 않습니다. SQL_FALSE 경우 PKCatalogName 은 일반적인 인수이며 문자 그대로 처리되며 대/소문자가 중요합니다. 자세한 내용은 카탈로그 함수의 인수를 참조 하세요.

NameLength1
[입력] *PKCatalogName의 길이(문자)입니다.

PKSchemaName
[입력] 기본 키 테이블 스키마 이름입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대한 스키마를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 빈 문자열("")은 스키마가 없는 테이블을 나타냅니다. PKSchemaName 에는 문자열 검색 패턴이 포함될 수 없습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정된 경우 PKSchemaName 은 식별자로 처리되고 해당 사례는 중요하지 않습니다. SQL_FALSE 경우 PKSchemaName 은 일반 인수이며 문자 그대로 처리되며 대/소문자도 중요합니다.

NameLength2
[입력] *PKSchemaName의 길이(문자)입니다.

PKTableName
[입력] 기본 키 테이블 이름입니다. PKTableName 은 문자열 검색 패턴을 포함할 수 없습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정된 경우 PKTableName 은 식별자로 처리되며 해당 사례는 중요하지 않습니다. SQL_FALSE 경우 PKTableName 은 일반 인수이며 문자 그대로 처리되며 대/소문자도 중요합니다.

NameLength3
[입력] *PKTableName의 길이(문자)입니다.

FKCatalogName
[입력] 외래 키 테이블 카탈로그 이름입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대해 카탈로그를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 빈 문자열("")은 카탈로그가 없는 테이블을 나타냅니다. FKCatalogName 은 문자열 검색 패턴을 포함할 수 없습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정된 경우 FKCatalogName 은 식별자로 처리되고 해당 사례는 중요하지 않습니다. SQL_FALSE 경우 FKCatalogName 은 일반적인 인수이며 문자 그대로 처리되며 대/소문자가 중요합니다.

NameLength4
[입력] *FKCatalogName의 길이(문자)입니다.

FKSchemaName
[입력] 외래 키 테이블 스키마 이름입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대한 스키마를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 빈 문자열("")은 스키마가 없는 테이블을 나타냅니다. FKSchemaName 에는 문자열 검색 패턴이 포함될 수 없습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정된 경우 FKSchemaName 은 식별자로 처리되고 해당 대/소문자는 중요하지 않습니다. SQL_FALSE 경우 FKSchemaName 은 일반적인 인수이며 문자 그대로 처리되며 대/소문자도 중요합니다.

NameLength5
[입력] *FKSchemaName의 길이(문자)입니다.

FKTableName
[입력] 외래 키 테이블 이름입니다. FKTableName 은 문자열 검색 패턴을 포함할 수 없습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정되면 FKTableName 은 식별자로 처리되고 해당 사례는 중요하지 않습니다. SQL_FALSE 경우 FKTableName 은 일반적인 인수이며 문자 그대로 처리되며 대/소문자도 중요합니다.

NameLength6
[입력] *FKTableName의 길이(문자)입니다.

반품

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR 또는 SQL_INVALID_HANDLE.

진단

SQLForeignKeys가 SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO 반환하는 경우 SQL_HANDLE_STMT HandleTypeHandle of StatementHandle을 사용하여 SQLGetDiagRec 를 호출하여 관련 SQLSTATE 값을 가져올 수 있습니다. 다음 표에서는 일반적으로 SQLForeignKeys에서 반환되는 SQLSTATE 값을 나열하고 이 함수의 컨텍스트에서 각 값을 설명합니다. 표기법 "(DM)"은 드라이버 관리자가 반환한 SQLSTATE에 대한 설명 앞에 나와 있습니다. 달리 명시되지 않는 한 각 SQLSTATE 값과 연결된 반환 코드는 SQL_ERROR.

SQLSTATE Error 설명
01000 일반 경고 드라이버 관련 정보 메시지입니다. 함수는 SQL_SUCCESS_WITH_INFO 반환합니다.
08S01 통신 링크 실패 드라이버와 드라이버가 연결된 데이터 원본 간의 통신 링크는 함수가 처리를 완료하기 전에 실패했습니다.
24000 커서 상태가 잘못되었습니다. StatementHandle에서 커서가 열려 있고 SQLFetch 또는 SQLFetchScroll이 호출되었습니다. 이 오류는 SQLFetch 또는 SQLFetchScroll이 SQL_NO_DATA 반환하지 않은 경우 드라이버 관리자가 반환하며, SQLFetch 또는 SQLFetchScroll이 SQL_NO_DATA 반환한 경우 드라이버에서 반환합니다.

StatementHandle에서 커서가 열려 있지만 SQLFetch 또는 SQLFetchScroll이 호출되지 않았습니다.
40001 Serialization 실패 다른 트랜잭션과의 리소스 교착 상태 때문에 트랜잭션이 롤백되었습니다.
40003 문 완성을 알 수 없음 이 함수를 실행하는 동안 연결된 연결이 실패했으며 트랜잭션 상태를 확인할 수 없습니다.
HY000 일반 오류 특정 SQLSTATE가 없고 구현별 SQLSTATE가 정의되지 않은 오류가 발생했습니다. *MessageText 버퍼의 SQLGetDiagRec에서 반환된 오류 메시지는 오류와 그 원인을 설명합니다.
HY001 메모리 할당 오류 드라이버가 함수 실행 또는 완료를 지원하는 데 필요한 메모리를 할당할 수 없습니다.
HY008 작업이 취소됨 StatementHandle에 대해 비동기 처리를 사용하도록 설정했습니다. 함수가 호출되었고 실행이 완료되기 전에 StatementHandle에서 SQLCancel 또는 SQLCancelHandle이 호출된 후 StatementHandle에서 함수가 다시 호출되었습니다.

함수가 호출되었고 실행을 완료하기 전에 다중 스레드 애플리케이션의 다른 스레드에서 StatementHandle에서 SQLCancel 또는 SQLCancelHandle이 호출되었습니다.
HY009 null 포인터를 잘못 사용했습니다. (DM) PKTableNameFKTableName 인수는 모두 null 포인터였습니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE , FKCatalogName 또는 PKCatalogName 인수가 null 포인터이고, SQL_CATALOG_NAME InfoType 은 카탈로그 이름이 지원됨을 반환합니다.

(DM) SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정되었으며 FKSchemaName, PKSchemaName, FKTableName 또는 PKTableName 인수가 null 포인터였습니다.
HY010 함수 시퀀스 오류 (DM) StatementHandle과 연결된 연결 핸들에 대해 비동기적으로 실행되는 함수가 호출되었습니다. 이 비동기 함수는 SQLForeignKeys 함수가 호출되었을 때 계속 실행되었습니다.

(DM) SQLExecute, SQLExecDirect 또는 SQLMoreResults가 StatementHandle에 대해 호출되고 SQL_PARAM_DATA_AVAILABLE 반환되었습니다. 이 함수는 모든 스트리밍된 매개 변수에 대해 데이터를 검색하기 전에 호출되었습니다.

(DM) 이 함수가 아닌 비동기 실행 함수가 StatementHandle에 대해 호출되었고 이 함수가 호출되었을 때 계속 실행되고 있었습니다.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations 또는 SQLSetPos가 StatementHandle에 대해 호출되고 SQL_NEED_DATA 반환되었습니다. 이 함수는 모든 실행 시 데이터 매개 변수 또는 열에 대한 데이터를 보내기 전에 호출되었습니다.
HY013 메모리 관리 오류 메모리 조건이 낮기 때문에 기본 메모리 개체에 액세스할 수 없기 때문에 함수 호출을 처리할 수 없습니다.
HY090 잘못된 문자열 또는 버퍼 길이 (DM) 이름 길이 인수 중 하나의 값이 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 를 호출해야 합니다.

주석

이 함수에서 반환된 정보를 사용하는 방법에 대한 자세한 내용은 카탈로그 데이터 사용을 참조 하세요.

*PKTableName 에 테이블 이름이 포함된 경우 SQLForeignKeys 는 지정된 테이블의 기본 키와 이를 참조하는 모든 외래 키를 포함하는 결과 집합을 반환합니다. 다른 테이블의 외화 키 목록에는 지정된 테이블의 고유 제약 조건을 가리키는 외세 키가 포함되지 않습니다.

*FKTableName 에 테이블 이름이 포함된 경우 SQLForeignKeys 는 다른 테이블의 기본 키를 가리키는 지정된 테이블의 모든 외세 키와 참조하는 다른 테이블의 기본 키를 포함하는 결과 집합을 반환합니다. 지정된 테이블의 외장 키 목록에는 다른 테이블의 고유 제약 조건을 참조하는 외세 키가 포함되어 있지 않습니다.

*PKTableName과 *FKTableName에 테이블 이름이 모두 포함된 경우 SQLForeignKeys는 *PKTableName에 지정된 테이블의 기본 키를 참조하는 *FKTableName에 지정된 테이블의 외래 키를 반환합니다. 이것은 최대 하나의 키여야 합니다.

참고 항목

ODBC 카탈로그 함수의 일반 사용, 인수 및 반환된 데이터에 대한 자세한 내용은 카탈로그 함수를 참조 하세요.

SQLForeignKeys는 결과를 표준 결과 집합으로 반환합니다 . 기본 키와 연결된 외래 키가 요청되면 결과 집합은 FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME 및 KEY_SEQ 따라 정렬됩니다. 외래 키와 연결된 기본 키가 요청되면 결과 집합은 PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME 및 KEY_SEQ 따라 정렬됩니다. 다음 표에서는 결과 집합의 열을 나열합니다.

VARCHAR 열의 길이는 테이블에 표시되지 않습니다. 실제 길이는 데이터 원본에 따라 달라집니다. PKTABLE_CAT 또는 FKTABLE_CAT, PKTABLE_SCHEM 또는 FKTABLE_SCHEM, PKTABLE_NAME 또는 FKTABLE_NAME, PKCOLUMN_NAME 또는 FKCOLUMN_NAME 열의 실제 길이를 확인하기 위해 애플리케이션은 SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN 및 SQL_MAX_COLUMN_NAME_LEN 옵션을 사용하여 SQLGetInfo를 호출할 수 있습니다.

ODBC 3*.x.* 열 이름 변경은 애플리케이션이 열 번호로 바인딩되므로 이전 버전과의 호환성에 영향을 미치지 않습니다.

ODBC 2.0 열 ODBC 3*.x* 열
PKTABLE_QUALIFIER PKTABLE_CAT
PKTABLE_OWNER PKTABLE_SCHEM
FKTABLE_QUALIFIER FK_TABLE_CAT
FKTABLE_OWNER FKTABLE_SCHEM

다음 표에서는 결과 집합의 열을 나열합니다. 드라이버에서 14열(REMARKS) 이외의 추가 열을 정의할 수 있습니다. 애플리케이션은 명시적 서수 위치를 지정하는 대신 결과 집합의 끝에서 카운트다운하여 드라이버별 열에 액세스할 수 있어야 합니다. 자세한 내용은 카탈로그 함수에서 반환된 데이터를 참조 하세요.

열 이름 Column number 데이터 형식 주석
PKTABLE_CAT(ODBC 1.0) 6 Varchar 기본 키 테이블 카탈로그 이름; 데이터 원본에 적용되지 않는 경우 NULL입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대해 카탈로그를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 카탈로그가 없는 테이블에 대해 빈 문자열("")을 반환합니다.
PKTABLE_SCHEM(ODBC 1.0) 2 Varchar 기본 키 테이블 스키마 이름; 데이터 원본에 적용되지 않는 경우 NULL입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대해 스키마를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 스키마가 없는 테이블에 대해 빈 문자열("")을 반환합니다.
PKTABLE_NAME(ODBC 1.0) 3 Varchar not NULL 기본 키 테이블 이름입니다.
PKCOLUMN_NAME(ODBC 1.0) 4 Varchar not NULL 기본 키 열 이름입니다. 드라이버는 이름이 없는 열에 대해 빈 문자열을 반환합니다.
FKTABLE_CAT(ODBC 1.0) 5 Varchar 외래 키 테이블 카탈로그 이름; 데이터 원본에 적용되지 않는 경우 NULL입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대해 카탈로그를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 카탈로그가 없는 테이블에 대해 빈 문자열("")을 반환합니다.
FKTABLE_SCHEM(ODBC 1.0) 6 Varchar 외래 키 테이블 스키마 이름; 데이터 원본에 적용되지 않는 경우 NULL입니다. 드라이버가 다른 DBMS에서 데이터를 검색하는 경우와 같이 일부 테이블에 대해 스키마를 지원하지만 다른 테이블에 대해서는 지원하지 않는 경우 스키마가 없는 테이블에 대해 빈 문자열("")을 반환합니다.
FKTABLE_NAME(ODBC 1.0) 7 Varchar not NULL 외래 키 테이블 이름입니다.
FKCOLUMN_NAME(ODBC 1.0) 8 Varchar not NULL 외래 키 열 이름입니다. 드라이버는 이름이 없는 열에 대해 빈 문자열을 반환합니다.
KEY_SEQ(ODBC 1.0) 9 Smallint not NULL 키의 열 시퀀스 번호입니다(1부터 시작).
UPDATE_RULE(ODBC 1.0) 10 Smallint SQL 작업이 UPDATE인 경우 외래 키에 적용할 작업입니다. 다음 값 중 하나를 사용할 수 있습니다. 참조된 테이블은 기본 키가 있는 테이블이고 참조 테이블은 외래 키가 있는 테이블입니다.

SQL_CASCADE: 참조된 테이블의 기본 키가 업데이트되면 참조 테이블의 외래 키도 업데이트됩니다.

SQL_NO_ACTION: 참조되는 테이블의 기본 키를 업데이트하면 참조 테이블에 "현수 참조"가 발생하는 경우(즉, 참조 테이블의 행에 참조된 테이블에 해당 항목이 없음) 업데이트가 거부됩니다. 참조 테이블의 외래 키를 업데이트하면 참조된 테이블의 기본 키 값으로 존재하지 않는 값이 도입되면 업데이트가 거부됩니다. 이 작업은 ODBC 2*.x*의 SQL_RESTRICT 작업과 동일합니다.

SQL_SET_NULL: 기본 키의 하나 이상의 구성 요소가 변경되는 방식으로 참조된 테이블의 하나 이상의 행이 업데이트되면 참조 테이블의 일치하는 모든 행에서 기본 키의 변경된 구성 요소에 해당하는 참조 테이블의 외래 키 구성 요소가 NULL로 설정됩니다.

SQL_SET_DEFAULT: 기본 키의 하나 이상의 구성 요소가 변경되는 방식으로 참조된 테이블의 하나 이상의 행이 업데이트되는 경우 기본 키의 변경된 구성 요소에 해당하는 참조 테이블의 외래 키 구성 요소는 참조 테이블의 일치하는 모든 행에서 적용 가능한 기본값으로 설정됩니다.

데이터 원본에 적용되지 않는 경우 NULL입니다.
DELETE_RULE(ODBC 1.0) 11 Smallint SQL 작업이 DELETE인 경우 외래 키에 적용할 작업입니다. 다음 값 중 하나를 사용할 수 있습니다. 참조된 테이블은 기본 키가 있는 테이블이고 참조 테이블은 외래 키가 있는 테이블입니다.

SQL_CASCADE: 참조된 테이블의 행이 삭제되면 참조 테이블의 일치하는 모든 행도 삭제됩니다.

SQL_NO_ACTION: 참조된 테이블에서 행을 삭제하면 참조 테이블에 "현수 참조"가 발생하는 경우(즉, 참조 테이블의 행에 참조된 테이블에 해당 항목이 없음) 업데이트가 거부됩니다. 이 작업은 ODBC 2*.x*의 SQL_RESTRICT 작업과 동일합니다.

SQL_SET_NULL: 참조된 테이블의 행을 하나 이상 삭제하면 참조 테이블의 외래 키의 각 구성 요소가 참조 테이블의 일치하는 모든 행에서 NULL로 설정됩니다.

SQL_SET_DEFAULT: 참조된 테이블의 행이 하나 이상 삭제되면 참조 테이블의 외래 키의 각 구성 요소가 참조 테이블의 일치하는 모든 행에서 적용 가능한 기본값으로 설정됩니다.

데이터 원본에 적용되지 않는 경우 NULL입니다.
FK_NAME(ODBC 2.0) 12 Varchar 외래 키 이름입니다. 데이터 원본에 적용되지 않는 경우 NULL입니다.
PK_NAME(ODBC 2.0) 13 Varchar 기본 키 이름입니다. 데이터 원본에 적용되지 않는 경우 NULL입니다.
지연 가능성(ODBC 3.0) 14 Smallint SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, SQL_NOT_DEFERRABLE.

코드 예

다음 표에 나와 있는 것처럼 이 예제에서는 ORDERS, LINES 및 CUSTOMERS라는 세 개의 테이블을 사용합니다.

ORDERS LINES 고객
Orderid Orderid CUSTID
CUSTID LINES 이름
OPENDATE PARTID 주소
판매원 수량 전화
상태

ORDERS 테이블에서 CUSTID는 판매가 이루어진 고객을 식별합니다. CUSTOMERS 테이블의 CUSTID를 참조하는 외래 키입니다.

LINES 테이블에서 ORDERID는 품목이 연결된 판매 주문을 식별합니다. ORDERS 테이블의 ORDERID를 참조하는 외래 키입니다.

이 예제에서는 SQLPrimaryKeys를 호출하여 ORDERS 테이블의 기본 키를 가져옵니다. 결과 집합에는 하나의 행이 있습니다. 다음 표에는 중요한 열이 나와 있습니다.

TABLE_NAME COLUMN_NAME KEY_SEQ
ORDERS Orderid 6

다음으로, 이 예제에서는 SQLForeignKeys를 호출하여 ORDERS 테이블의 기본 키를 참조하는 다른 테이블의 외래 키를 가져옵니다. 결과 집합에는 하나의 행이 있습니다. 다음 표에는 중요한 열이 나와 있습니다.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
ORDERS CUSTID LINES CUSTID 6

마지막으로, 이 예제에서는 SQLForeignKeys를 호출하여 다른 테이블의 기본 키를 참조하는 ORDERS 테이블의 외세 키를 가져옵니다. 결과 집합에는 하나의 행이 있습니다. 다음 표에는 중요한 열이 나와 있습니다.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
고객 CUSTID ORDERS CUSTID 6
#define TAB_LEN SQL_MAX_TABLE_NAME_LEN + 1  
#define COL_LEN SQL_MAX_COLUMN_NAME_LEN + 1  
  
LPSTR   szTable;              /* Table to display */  
  
UCHAR szPkTable[TAB_LEN];   /* Primary key table name */  
UCHAR szFkTable[TAB_LEN];   /* Foreign key table name */  
UCHAR szPkCol[COL_LEN];     /* Primary key column */  
UCHAR szFkCol[COL_LEN];     /* Foreign key column */  
  
SQLHSTMT      hstmt;  
SQLINTEGER    cbPkTable, cbPkCol, cbFkTable, cbFkCol, cbKeySeq;  
SQLSMALLINT   iKeySeq;  
SQLRETURN     retcode;  
  
// Bind the columns that describe the primary and foreign keys.  
// Ignore the table schema, name, and catalog for this example.  
  
SQLBindCol(hstmt, 3, SQL_C_CHAR, szPkTable, TAB_LEN, &cbPkTable);  
SQLBindCol(hstmt, 4, SQL_C_CHAR, szPkCol, COL_LEN, &cbPkCol);  
SQLBindCol(hstmt, 5, SQL_C_SSHORT, &iKeySeq, TAB_LEN, &cbKeySeq);  
SQLBindCol(hstmt, 7, SQL_C_CHAR, szFkTable, TAB_LEN, &cbFkTable);  
SQLBindCol(hstmt, 8, SQL_C_CHAR, szFkCol, COL_LEN, &cbFkCol);  
  
strcpy_s(szTable, sizeof(szTable), "ORDERS");  
  
/* Get the names of the columns in the primary key. */  
  
retcode = SQLPrimaryKeys(hstmt,  
         NULL, 0,             /* Catalog name */  
         NULL, 0,             /* Schema name */  
         szTable, SQL_NTS);   /* Table name */  
  
while ((retcode == SQL_SUCCESS) || (retcode == SQL SUCCESS_WITH_INFO)) {  
  
   /* Fetch and display the result set. This will be a list of the */  
   /* columns in the primary key of the ORDERS table. */  
  
   retcode = SQLFetch(hstmt);  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
      fprintf(out, "Table: %s Column: %s Key Seq: %hd \n", szPkTable, szPkCol,  
      iKeySeq);  
}  
  
/* Close the cursor (the hstmt is still allocated). */  
  
SQLFreeStmt(hstmt, SQL_CLOSE);  
  
/* Get all the foreign keys that refer to ORDERS primary key.*/   
  
retcode = SQLForeignKeys(hstmt,  
         NULL, 0,            /* Primary catalog */  
         NULL, 0,            /* Primary schema */  
         szTable, SQL_NTS,   /* Primary table */  
         NULL, 0,            /* Foreign catalog */  
         NULL, 0,            /* Foreign schema */  
         NULL, 0);           /* Foreign table */  
  
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {  
  
/* Fetch and display the result set. This will be all of the */  
/* foreign keys in other tables that refer to the ORDERS */  
/* primary key. */  
  
   retcode = SQLFetch(hstmt);  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
      fprintf(out, "%-s ( %-s ) <-- %-s ( %-s )\n", szPkTable,  
               szPkCol, szFkTable, szFkCol);  
}  
  
/* Close the cursor (the hstmt is still allocated). */  
  
SQLFreeStmt(hstmt, SQL_CLOSE);  
  
/* Get all the foreign keys in the ORDERS table. */  
  
retcode = SQLForeignKeys(hstmt,  
         NULL, 0,             /* Primary catalog */  
         NULL, 0,             /* Primary schema */  
         NULL, 0,             /* Primary table */  
         NULL, 0,             /* Foreign catalog */  
         NULL, 0,             /* Foreign schema */  
         szTable, SQL_NTS);   /* Foreign table */  
  
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {  
  
/* Fetch and display the result set. This will be all of the */  
/* primary keys in other tables that are referred to by foreign */  
/* keys in the ORDERS table. */  
  
   retcode = SQLFetch(hstmt);  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
      fprintf(out, "%-s ( %-s )--> %-s ( %-s )\n", szFkTable, szFkCol, szPkTable, szPkCol);  
}  
  
/* Free the hstmt. */  
SQLFreeStmt(hstmt, SQL_DROP);  
추가 정보 참조
결과 집합의 열에 버퍼 바인딩 SQLBindCol 함수
문 처리 취소 SQLCancel 함수
단일 행 또는 데이터 블록을 정방향으로 가져오기 SQLFetch 함수
데이터 블록을 가져오거나 결과 집합을 스크롤합니다. SQLFetchScroll 함수
기본 키의 열 반환 SQLPrimaryKeys 함수
테이블 통계 및 인덱스 반환 SQLStatistics 함수

참고 항목

ODBC API 참조
ODBC 헤더 파일