다음을 통해 공유


SQLSpecialColumns 함수

규칙
버전 소개: ODBC 1.0 표준 준수: 오픈 그룹

요약
SQLSpecialColumns는 지정된 테이블 내의 열에 대한 다음 정보를 검색합니다.

  • 테이블의 행을 고유하게 식별하는 최적의 열 집합입니다.

  • 행의 값이 트랜잭션에 의해 업데이트되면 자동으로 업데이트되는 열입니다.

구문

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

인수

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

IdentifierType
[입력] 반환할 열의 형식입니다. 다음 값 중 하나여야 합니다.

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 경우 CatalogName 은 일반 인수이며 문자 그대로 처리되며 대/소문자도 중요합니다. 자세한 내용은 카탈로그 함수의 인수를 참조 하세요.

NameLength1
[입력] *CatalogName 문자의 길이입니다.

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

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

NameLength2
[입력] *SchemaName 문자의 길이입니다.

TableName
[입력] 테이블 이름입니다. 이 인수는 null 포인터일 수 없습니다. TableName 은 문자열 검색 패턴을 포함할 수 없습니다.

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

NameLength3
[입력] *TableName 문자의 길이입니다.

범위
[입력] rowid의 최소 필수 범위입니다. 반환된 rowid는 더 큰 범위일 수 있습니다. 다음 중 하나여야 합니다.

SQL_SCOPE_CURROW: rowid는 해당 행에 배치되는 동안에만 유효합니다. 행이 다른 트랜잭션에 의해 업데이트되거나 삭제된 경우 rowid를 사용하여 나중에 다시 선택하면 행이 반환되지 않을 수 있습니다.

SQL_SCOPE_TRANSACTION: rowid는 현재 트랜잭션 기간 동안 유효합니다.

SQL_SCOPE_SESSION: rowid는 세션 기간 동안(트랜잭션 경계를 넘어) 유효하도록 보장됩니다.

Nullable
[입력] 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.

진단

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

SQLSTATE 오류 설명
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 포인터를 잘못 사용했습니다. 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) 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 같지 않았습니다.

길이 인수 중 하나의 값이 해당 이름의 최대 길이 값을 초과했습니다. InfoType 값(SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN 또는 SQL_MAX_TABLE_NAME_LEN)을 사용하여 SQLGetInfo를 호출하여 각 이름의 최대 길이를 가져올 수 있습니다.
HY097 열 형식이 범위를 벗어났습니다. (DM) 잘못된 IdentifierType 값이 지정되었습니다.
HY098 범위 유형이 범위를 벗어났습니다. (DM) 잘못된 범위 값이 지정되었습니다.
HY099 Nullable 형식이 범위를 벗어났습니다. (DM) 잘못된 Nullable 값이 지정되었습니다.
HY117 알 수 없는 트랜잭션 상태로 인해 커넥트ion이 일시 중단됩니다. 연결 끊기 및 읽기 전용 함수만 허용됩니다. (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 연결 제한 시간이 만료됨 데이터 원본이 요청에 응답하기 전에 연결 제한 시간이 만료되었습니다. 연결 제한 시간은 SQLSet커넥트Attr, SQL_ATTR_CONNECTION_TIMEOUT 통해 설정됩니다.
IM001 드라이버는 이 함수를 지원하지 않습니다. (DM) StatementHandle연결된 드라이버는 함수를 지원하지 않습니다.
IM017 비동기 알림 모드에서 폴링을 사용할 수 없습니다. 알림 모델을 사용할 때마다 폴링이 비활성화됩니다.
IM018 이 핸들에서 이전 비동기 작업을 완료하기 위해 SQLCompleteAsync 가 호출되지 않았습니다. 핸들의 이전 함수 호출이 SQL_STILL_EXECUTING 반환하고 알림 모드가 활성화된 경우 사후 처리를 수행하고 작업을 완료하려면 핸들에서 SQLCompleteAsync 를 호출해야 합니다.

설명

IdentifierType 인수가 SQL_BEST_ROWID SQLSpecialColumns는 테이블의 각 행을 고유하게 식별하는 열 또는 열을 반환합니다. 이러한 열은 항상 select-list 또는 WHERE 절에서 사용할 수 있습니다. 테이블 열에 대한 다양한 정보를 반환하는 데 사용되는 SQLColumns는 각 행을 고유하게 식별하는 열 또는 행의 값이 트랜잭션에 의해 업데이트되면 자동으로 업데이트되는 열을 반드시 반환하지는 않습니다. 예를 들어 SQLColumns는 Oracle 의사 열 ROWID를 반환하지 않을 수 있습니다. 이 때문에 SQLSpecialColumns 는 이러한 열을 반환하는 데 사용됩니다. 자세한 내용은 카탈로그 데이터 사용을 참조 하세요.

참고 항목

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

테이블의 각 행을 고유하게 식별하는 열이 없으면 SQLSpecialColumns는 행이 없는 행 집합을 반환합니다. 문에서 SQLFetch 또는 SQLFetchScroll에 대한 후속 호출은 SQL_NO_DATA 반환합니다.

IdentifierType, Scope 또는 Nullable 인수가 데이터 원본에서 지원하지 않는 특성을 지정하는 경우 SQLSpecialColumns는 빈 결과 집합을 반환합니다.

SQL_ATTR_METADATA_ID 문 특성이 SQL_TRUE 설정된 경우 CatalogName, SchemaName 및 TableName 인수는 식별자로 처리되므로 특정 상황에서는 null 포인터로 설정할 수 없습니다. (자세한 내용은 를 참조하세요 .카탈로그 함수의 인수입니다.)

SQLSpecialColumns는 결과를 SCOPE에 따라 정렬된 표준 결과 집합으로 반환합니다.

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

ODBC 2.0 열 ODBC 3.x
PRECISION COLUMN_SIZE
LENGTH BUFFER_LENGTH
SCALE DECIMAL_DIGITS

COLUMN_NAME 열의 실제 길이를 확인하기 위해 애플리케이션은 SQL_MAX_COLUMN_NAME_LEN 옵션을 사용하여 SQLGetInfo를 호출할 수 있습니다.

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

열 이름 Column number 데이터 형식 설명
SCOPE(ODBC 1.0) 1 Smallint rowid의 실제 범위입니다. 다음 값 중 하나를 포함합니다.

SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION

IdentifierType이 SQL_ROWVER 때 NULL이 반환됩니다. 각 값에 대한 설명은 이 섹션의 앞부분에 있는 "구문"의 범위 설명을 참조하세요.
COLUMN_NAME(ODBC 1.0) 2 Varchar not NULL 열 이름. 드라이버는 이름이 없는 열에 대해 빈 문자열을 반환합니다.
DATA_TYPE(ODBC 1.0) 3 Smallint not NULL SQL 데이터 형식입니다. ODBC SQL 데이터 형식 또는 드라이버별 SQL 데이터 형식일 수 있습니다. 유효한 ODBC SQL 데이터 형식 목록은 SQL 데이터 형식을 참조 하세요. 드라이버별 SQL 데이터 형식에 대한 자세한 내용은 드라이버 설명서를 참조하세요.
TYPE_NAME(ODBC 1.0) 4 Varchar not NULL 데이터 원본 종속 데이터 형식 이름; 예를 들어 "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" 또는 "CHAR ( ) FOR BIT DATA"입니다.
COLUMN_SIZE(ODBC 1.0) 5 정수 데이터 원본의 열 크기입니다. 열 크기에 대한 자세한 내용은 열 크기, 10진수, 8진수 길이 전송 및 표시 크기를 참조 하세요.
BUFFER_LENGTH(ODBC 1.0) 6 정수 SQL_C_DEFAULT 지정한 경우 SQLGetData 또는 SQLFetch 작업에서 전송되는 데이터의 길이(바이트)입니다. 숫자 데이터의 경우 이 크기는 데이터 원본에 저장된 데이터의 크기와 다를 수 있습니다. 이 값은 문자 데이터의 COLUMN_SIZE 열과 다를 수 있습니다. 자세한 내용은 열 크기, 10진수, 8진수 길이 전송 및 표시 크기를 참조 하세요.
DECIMAL_DIGITS(ODBC 1.0) 7 Smallint 데이터 원본에 있는 열의 10진수입니다. 소수 자릿수를 적용할 수 없는 데이터 형식에 대해 NULL이 반환됩니다. 소수 자릿수에 대한 자세한 내용은 열 크기, 10진수, 8진수 길이 전송 및 표시 크기를 참조하세요.
PSEUDO_COLUMN(ODBC 2.0) 8 Smallint 열이 Oracle ROWID와 같은 의사 열인지 여부를 나타냅니다.

SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO 참고: 상호 운용성을 극대화하려면 의사 열을 SQLGetInfo에서 반환된 식별자 따옴표 문자로 따옴표로 묶지 않아야 합니다.

애플리케이션이 SQL_BEST_ROWID 값을 검색한 후 애플리케이션은 이러한 값을 사용하여 정의된 범위 내에서 해당 행을 다시 선택할 수 있습니다. SELECT 문은 행이나 행을 하나도 반환하지 않습니다.

애플리케이션이 rowid 열 또는 열에 따라 행을 다시 선택하고 행을 찾을 수 없는 경우 애플리케이션은 행이 삭제되었거나 rowid 열이 수정되었다고 가정할 수 있습니다. 그 반대의 경우도 마찬가지입니다. rowid가 변경되지 않은 경우에도 행의 다른 열이 변경되었을 수 있습니다.

열 형식 SQL_BEST_ROWID 대해 반환된 열은 행 집합에서 가장 최근 데이터를 검색하기 위해 결과 집합 내에서 앞뒤로 스크롤해야 하는 애플리케이션에 유용합니다. rowid의 열 또는 열은 해당 행에 배치된 동안 변경되지 않도록 보장됩니다.

행에 커서가 배치되지 않은 경우에도 rowid의 열 또는 열이 다시 유효할 수 기본. 애플리케이션은 결과 집합에서 SCOPE 열을 검사 이를 확인할 수 있습니다.

열 형식 SQL_ROWVER 대해 반환된 열은 행이 rowid를 사용하여 다시 선택되는 동안 지정된 행의 열이 업데이트되었는지 여부를 검사 기능이 필요한 애플리케이션에 유용합니다. 예를 들어 rowid를 사용하여 행을 다시 선택한 후 애플리케이션은 SQL_ROWVER 열의 이전 값을 방금 가져온 값과 비교할 수 있습니다. SQL_ROWVER 열의 값이 이전 값과 다른 경우 애플리케이션은 디스플레이의 데이터가 변경되었음을 사용자에게 알릴 수 있습니다.

코드 예

유사한 함수의 코드 예제는 SQLColumns를 참조 하세요.

추가 정보 참조
결과 집합의 열에 버퍼 바인딩 SQLBindCol 함수
문 처리 취소 SQLCancel 함수
테이블 또는 테이블의 열 반환 SQLColumns 함수
단일 행 또는 데이터 블록을 정방향으로 가져오기 SQLFetch 함수
데이터 블록을 가져오거나 결과 집합을 스크롤합니다. SQLFetchScroll 함수
기본 키의 열 반환 SQLPrimaryKeys 함수

참고 항목

ODBC API 참조
ODBC 헤더 파일