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 HandleType 및Handle 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) PKTableName 및 FKTableName 인수는 모두 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 함수 |