SQLMoreResults 함수
규칙
도입된 버전: ODBC 1.0 표준 준수: ODBC
요약
SQLMoreResults는 SELECT, UPDATE, INSERT 또는 DELETE 문이 포함된 문에서 더 많은 결과를 사용할 수 있는지 여부를 결정하고, 이 경우 해당 결과에 대한 처리를 초기화합니다.
구문
SQLRETURN SQLMoreResults(
SQLHSTMT StatementHandle);
인수
StatementHandle
[입력] 문 핸들입니다.
반품
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE 또는 SQL_PARAM_DATA_AVAILABLE.
진단
SQLMoreResults가 SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO 반환하는 경우 SQL_HANDLE_STMT HandleType 및 Handle of StatementHandle을 사용하여 SQLGetDiagRec 를 호출하여 관련 SQLSTATE 값을 가져올 수 있습니다. 다음 표에서는 SQLMoreResults에서 일반적으로 반환되는 SQLSTATE 값을 나열하고 이 함수의 컨텍스트에서 각 값을 설명합니다. 표기법 "(DM)"은 드라이버 관리자가 반환한 SQLSTATE에 대한 설명 앞에 나와 있습니다. 달리 명시되지 않는 한 각 SQLSTATE 값과 연결된 반환 코드는 SQL_ERROR.
SQLSTATE | Error | 설명 |
---|---|---|
01000 | 일반 경고 | 드라이버 관련 정보 메시지입니다. 함수는 SQL_SUCCESS_WITH_INFO 반환합니다. |
01S02 | 옵션 값이 변경되었습니다. | 일괄 처리가 처리될 때 문 특성의 값이 변경되었습니다. 함수는 SQL_SUCCESS_WITH_INFO 반환합니다. |
08S01 | 통신 링크 실패 | 드라이버와 드라이버가 연결된 데이터 원본 간의 통신 링크는 함수가 처리를 완료하기 전에 실패했습니다. |
40001 | Serialization 실패 | 다른 트랜잭션과의 리소스 교착 상태 때문에 트랜잭션이 롤백되었습니다. |
40003 | 문 완성을 알 수 없음 | 이 함수를 실행하는 동안 연결된 연결이 실패했으며 트랜잭션 상태를 확인할 수 없습니다. |
HY000 | 일반 오류 | 특정 SQLSTATE가 없고 구현별 SQLSTATE가 정의되지 않은 오류가 발생했습니다. *MessageText 버퍼의 SQLGetDiagRec에서 반환된 오류 메시지는 오류와 그 원인을 설명합니다. |
HY001 | 메모리 할당 오류 | 드라이버가 함수 실행 또는 완료를 지원하는 데 필요한 메모리를 할당할 수 없습니다. |
HY008 | 작업이 취소됨 | StatementHandle에 대해 비동기 처리를 사용하도록 설정했습니다. SQLMoreResults 함수가 호출되었고 실행을 완료하기 전에 StatementHandle에서 SQLCancel 또는 SQLCancelHandle이 호출되었습니다. 그런 다음 StatementHandle에서 SQLMoreResults 함수가 다시 호출되었습니다. SQLMoreResults 함수가 호출되었고 실행을 완료하기 전에 다중 스레드 애플리케이션의 다른 스레드에서 StatementHandle에서 SQLCancel 또는 SQLCancelHandle이 호출되었습니다. |
HY010 | 함수 시퀀스 오류 | (DM) StatementHandle과 연결된 연결 핸들에 대해 비동기적으로 실행되는 함수가 호출되었습니다. 이 비동기 함수는 SQLMoreResults 함수가 호출되었을 때 계속 실행되었습니다. (DM) 이 함수가 아닌 비동기 실행 함수가 StatementHandle에 대해 호출되었고 이 함수가 호출되었을 때 계속 실행되고 있었습니다. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations 또는 SQLSetPos가 StatementHandle에 대해 호출되고 SQL_NEED_DATA 반환되었습니다. 이 함수는 모든 실행 시 데이터 매개 변수 또는 열에 대한 데이터를 보내기 전에 호출되었습니다. |
HY013 | 메모리 관리 오류 | 메모리 조건이 낮기 때문에 기본 메모리 개체에 액세스할 수 없기 때문에 함수 호출을 처리할 수 없습니다. |
HY117 | 알 수 없는 트랜잭션 상태로 인해 연결이 일시 중단됩니다. 연결 끊기 및 읽기 전용 함수만 허용됩니다. | (DM) 일시 중단 상태에 대한 자세한 내용은 SQLEndTran 함수를 참조 하세요. |
HYT01 | 연결 제한 시간이 만료됨 | 데이터 원본이 요청에 응답하기 전에 연결 제한 시간이 만료되었습니다. 연결 제한 시간은 SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr를 통해 설정됩니다. |
IM001 | 드라이버는 이 함수를 지원하지 않습니다. | (DM) StatementHandle과 연결된 드라이버는 함수를 지원하지 않습니다. |
IM017 | 비동기 알림 모드에서 폴링을 사용할 수 없습니다. | 알림 모델을 사용할 때마다 폴링이 비활성화됩니다. |
IM018 | 이 핸들에서 이전 비동기 작업을 완료하기 위해 SQLCompleteAsync 가 호출되지 않았습니다. | 핸들의 이전 함수 호출이 SQL_STILL_EXECUTING 반환하고 알림 모드가 활성화된 경우 사후 처리를 수행하고 작업을 완료하려면 핸들에서 SQLCompleteAsync 를 호출해야 합니다. |
주석
SELECT 문은 결과 집합을 반환합니다. UPDATE, INSERT 및 DELETE 문은 영향을 받는 행 수를 반환합니다. 이러한 문이 일괄 처리되거나, 매개 변수 배열로 제출되거나(매개 변수 순서가 증가하는 순서로 번호가 매겨지거나, 일괄 처리에 표시되는 순서대로) 프로시저에서 여러 결과 집합 또는 행 수를 반환할 수 있습니다. 문 및 매개 변수 배열의 일괄 처리에 대한 자세한 내용은 SQL 문 일괄 처리 및 매개 변수 값 배열을 참조하세요.
일괄 처리를 실행한 후 애플리케이션은 첫 번째 결과 집합에 배치됩니다. 애플리케이션은 단일 결과 집합이 있는 경우와 마찬가지로 첫 번째 또는 후속 결과 집합에서 SQLBindCol, SQLBulkOperations, SQLFetch, SQLGetData, SQLFetchScroll, SQLSetPos 및 모든 메타데이터 함수를 호출할 수 있습니다. 첫 번째 결과 집합으로 완료되면 애플리케이션은 SQLMoreResults를 호출하여 다음 결과 집합으로 이동합니다. 다른 결과 집합 또는 개수를 사용할 수 있는 경우 SQLMoreResults 는 SQL_SUCCESS 반환하고 추가 처리를 위해 결과 집합 또는 개수를 초기화합니다. 결과 집합 생성 문 사이에 행 개수 생성 문이 표시되면 SQLMoreResults를 호출하여 단계별로 실행할 수 있습니다. UPDATE, INSERT 또는 DELETE 문에 대해 SQLMoreResults를 호출한 후 애플리케이션은 SQLRowCount를 호출할 수 있습니다.
현재 행 이 없는 결과 집합이 있는 경우 SQLMoreResults 는 해당 결과 집합을 삭제하고 다음 결과 집합 또는 개수를 사용할 수 있게 합니다. 모든 결과가 처리된 경우 SQLMoreResults는 SQL_NO_DATA 반환합니다 . 일부 드라이버의 경우 모든 결과 집합 및 행 수를 처리할 때까지 출력 매개 변수 및 반환 값을 사용할 수 없습니다. 이러한 드라이버의 경우 SQLMoreResults가 SQL_NO_DATA 반환할 때 출력 매개 변수 및 반환 값을 사용할 수 있습니다.
이전 결과 집합에 대해 설정된 모든 바인딩은 여전히 유효합니다. 이 결과 집합에 대해 열 구조가 다른 경우 SQLFetch 또는 SQLFetchScroll을 호출하면 오류 또는 잘림이 발생할 수 있습니다. 이를 방지하기 위해 애플리케이션은 SQLBindCol을 호출하여 명시적으로 적절하게 다시 바인딩해야 합니다(또는 설명자 필드를 설정하여 다시 바인딩). 또는 애플리케이션은 SQL_UNBIND 옵션을 사용하여 SQLFreeStmt 를 호출하여 모든 열 버퍼를 바인딩 해제할 수 있습니다.
애플리케이션이 SQLMoreResults를 호출하여 일괄 처리를 탐색할 때 커서 형식, 커서 동시성, 키 집합 크기 또는 최대 길이와 같은 문 특성의 값이 변경될 수 있습니다. 이 경우 SQLMoreResults 는 SQL_SUCCESS_WITH_INFO 및 SQLSTATE 01S02를 반환합니다(옵션 값이 변경됨).
SQL_CLOSE 옵션을 사용하여 SQLCloseCursor 또는 SQLFreeStmt 를 호출하면 일괄 처리 실행의 결과로 사용 가능한 모든 결과 집합과 행 수가 삭제됩니다. 문 핸들은 할당되거나 준비된 상태로 돌아갑니다. 일괄 처리가 실행되고 문 핸들이 실행됨, 커서 위치 또는 비동기 상태에 있을 때 SQLCancel을 호출하여 비동기 실행 함수를 취소하면 취소 호출이 성공한 경우 일괄 처리에서 생성된 모든 결과 집합 및 행 수가 삭제됩니다. 그런 다음 문은 준비되거나 할당된 상태로 돌아갑니다.
문 또는 프로시저의 일괄 처리가 SELECT, UPDATE, INSERT 및 DELETE 문과 다른 SQL 문을 혼합하는 경우 이러한 다른 문은 SQLMoreResults에 영향을 미치지 않습니다.
자세한 내용은 여러 결과를 참조하세요.
문 일괄 처리에서 검색된 업데이트, 삽입 또는 삭제 문이 데이터 원본 의 행에 영향을 주지 않으면 SQLMoreResults는 SQL_SUCCESS 반환합니다 . 이는 데이터 원본의 행에 영향을 주지 않는 경우 SQL_NO_DATA 반환하는 SQLExecDirect, SQLExecute 또는 SQLParamData를 통해 실행되는 검색된 업데이트, 삽입 또는 삭제 문의 경우와 다릅니다. SQLMoreResults에 대한 호출이 행에 영향을 주지 않은 후 애플리케이션이 SQLRowCount를 호출하여 행 수를 검색하는 경우 SQLRowCount는 SQL_NO_DATA 반환합니다.
결과 처리 함수의 유효한 시퀀싱에 대한 자세한 내용은 부록 B: ODBC 상태 전환 테이블을 참조 하세요.
SQL_PARAM_DATA_AVAILABLE 및 스트리밍된 출력 매개 변수에 대한 자세한 내용은 SQLGetData를 사용하여 출력 매개 변수 검색을 참조하세요.
행 개수의 가용성
일괄 처리에 여러 개의 연속 행 개수 생성 문이 포함된 경우 이러한 행 수가 하나의 행 수로 롤업될 수 있습니다. 예를 들어 일괄 처리에 5개의 insert 문이 있는 경우 특정 데이터 원본은 5개의 개별 행 수를 반환할 수 있습니다. 특정 다른 데이터 원본은 5개의 개별 행 개수의 합계를 나타내는 하나의 행 개수만 반환합니다.
일괄 처리에 결과 집합 생성 및 행 개수 생성 문의 조합이 포함된 경우 행 개수는 전혀 사용할 수 없을 수도 있고 그렇지 않을 수도 있습니다. 행 개수의 가용성과 관련하여 드라이버의 동작은 SQLGetInfo 호출을 통해 사용할 수 있는 SQL_BATCH_ROW_COUNT 정보 형식으로 열거됩니다. 예를 들어 일괄 처리에 SELECT가 있고 그 다음에는 INSERT2개와 SELECT가 있다고 가정합니다. 그런 다음 다음과 같은 경우가 가능합니다.
두 INSERT 문에 해당하는 행 수는 전혀 사용할 수 없습니다. SQLMoreResults에 대한 첫 번째 호출은 두 번째 SELECT 문의 결과 집합에 배치됩니다.
두 INSERT 문에 해당하는 행 수는 개별적으로 사용할 수 있습니다. (에 대한 호출 SQLGetInfo는 SQL_BATCH_ROW_COUNT 정보 형식에 대한 SQL_BRC_ROLLED_UP 비트를 반환하지 않습니다.) SQLMoreResults에 대한 첫 번째 호출은 첫 번째 INSERT의 행 개수에 배치되고 두 번째 호출은 두 번째 INSERT의 행 수에 배치됩니다. SQLMoreResults에 대한 세 번째 호출은 두 번째 SELECT 문의 결과 집합에 배치됩니다.
두 INSERT 에 해당하는 행 수는 사용할 수 있는 하나의 행 수로 롤업됩니다. (에 대한 호출 SQLGetInfo는 SQL_BATCH_ROW_COUNT 정보 형식의 SQL_BRC_ROLLED_UP 비트를 반환합니다.) SQLMoreResults에 대한 첫 번째 호출은 롤업된 행 수에 배치되고, SQLMoreResults에 대한 두 번째 호출은 두 번째 SELECT의 결과 집합에 배치됩니다.
특정 드라이버는 저장 프로시저가 아닌 명시적 일괄 처리에만 행 수를 사용할 수 있도록 합니다.
관련 함수
추가 정보 | 참조 |
---|---|
문 처리 취소 | SQLCancel 함수 |
데이터 블록을 가져오거나 결과 집합을 스크롤합니다. | SQLFetchScroll 함수 |
단일 행 또는 데이터 블록을 정방향으로 가져오기 | SQLFetch 함수 |
데이터 열의 일부 또는 전체 가져오기 | SQLGetData 함수 |