콘텐츠로 이동

SQLSetPos

SQLSetPos#

행집합 내에서 커서 위치를 지정한다.

구 문#

SQLRETURN  SQLSetPos (
    SQLHSTMT    stmt,
    SQLSETPOSIROW   rowNumber,
    SQLUSMALLINT    operation,
    SQLUSMALLINT    lockType);

인 자#

자료유형 인자 사용 설명
SQLHSTMT stmt 입력 명령문 핸들
SQLSETPOSIROW rowNumber 입력 행집합에서 operation 인자로 지정한 작업을 수행할 행의 위치. 1부터 시작한다.
0이면 행집합의 모든 행에 작업을 적용한다.
SQLUSMALLINT operation 입력 수행할 작업. 다음 중 하나가 올 수 있다:
- SQL_POSITION
- SQL_REFRESH
- SQL_UPDATE
- SQL_DELETE
SQLUSMALLINT lockType 입력 잠금 유형. 현재 미지원.

결괏값#

SQL_SUCCESS
SQL_SUCCESS_WITH_INFO
SQL_NEED_DATA
SQL_STILL_EXECUTING
SQL_INVALID_HANDLE
SQL_ERROR 

설 명#

SQLSetPos는 행집합 내에서 커서의 위치를 지정하고, 그 위치의 데이터를 새로 가져오거나 갱신 또는 삭제하도록 해준다. rowNumber는 행집합 내에서 작업을 수행할 행의 번호를 지정한다. rowNumber가 1이면 행집합에서 첫 번째 행을 가리킨다. rowNumber가 0이면 행집합 내의 모든 행에 작업이 적용된다. 하지만 operation이 SQL_POSITION일 때, rowNumber는 0일 수 없다.

커서 위치는 아래의 작업에 요구된다:

  • SQLGetData 호출 시

  • SQL_DELETE, SQL_REFRESH, 또는 SQL_UPDATE 옵션으로 SQLSetPos 호출 시

SELECT문 실행 후 처음 fetch를 하면 행집합 내에서 커서의 위치는 1이다.

SQLSetPos 함수의 operation 인자에는 아래의 옵션이 지원된다:

옵션 설명
SQL_POSITION 드라이버는 rowNumber로 지정한 행에 커서를 둔다.
SQL_REFRESH 드라이버는 rowNumber로 지정한 행에 커서를 두고, 행집합 버퍼 내의 그 행의 데이터를 새로 가져온다.
만약 rowNumber에 0을 지정하면, 행집합 내의 모든 행의 데이터를 새로 가져온다.
만약 드라이버가 HOLE을 감지하면 행 상태 값으로 SQL_ROW_DELETED를 반환한다.
커서가 Sensitive이면 드라이버는 데이터베이스에서 최신 데이터를 가져오고, 아니면 캐시에서 기존 데이터를 가져온다.
SQL_UPDATE 드라이버는 rowNumber로 지정한 행에 커서를 두고, 행집합 버퍼 내의 그 행의 데이터로 데이터베이스의 데이터를 갱신한다.
만약 rowNumber에 0을 지정하면, 행집합 내의 모든 데이터로 데이터베이스를 갱신한다.
SQLBindCol의 length/indicator 인자에 SQL_COLUMN_IGNORE를 지정하면 그 칼럼은 갱신되지 않는다.
SQL_ATTR_ROW_OPERATION_PTR 명령문 속성에 의해 설정된 행 작업 배열에 SQL_ROW_IGNORE로 설정한 행이 있다면, 그 행은 무시하고 다음 행을 갱신한다.
SQL_DELETE 드라이버는 rowNumber로 지정한 행에 커서를 두고, 그 행을 삭제한다.
만약 rowNumber에 0을 지정하면, 행집합 내의 모든 행을 삭제한다.
SQL_ATTR_ROW_OPERATION_PTR 명령문 속성에 의해 설정된 행 작업 배열에 SQL_ROW_IGNORE로 설정한 행이 있다면, 그 행은 무시하고 다음 행을 삭제한다.

SQLSetPos 사용하기#

애플리케이션에서 SQLSetPos을 호출하려면, 아래의 단계대로 프로그램을 작성하라:

  1. SQLBindCol을 호출해서 버퍼 바인딩

  2. SQLExecDirect등을 이용해서 SELECT 쿼리문 실행

  3. SQL_UPDATE 옵션으로 SQLSetPos를 호출하려면,

    • 한 버퍼의 데이터를 변경하고자 하는 값으로 변경

    • 칼럼을 무시하려면 length/indicator를 SQL_COLUMN_IGNORE로 지정해서 SQLBindCol을 재호출

    • 행을 작업 대상에서 제외하려면, SQL_ATTR_ROW_OPERATION_PTR 명령문 속성을 설정하고 그 행에 대응하는 배열 요소에 SQL_ROW_IGNORE를 설정

  4. SQLSetPos 호출

    • L_ATTR_ROW_STATUS_PTR 명령문 속성에 상태 배열을 설정했다면, 이 배열의 값을 통해 각 행의 수행 결과를 확인할 수 있다.

진 단#

SQLSTATE 설명 부연설명
HY000 일반 오류
HY001 메모리 할당 오류 Altibase CLI 드라이버가 함수를 실행하고 완료하기 위해 요구된 메모리를 할당할 수 없음
08S01 통신 회선 장애 (데이터 송수신 실패) Altibase CLI 드라이버와 DB간에 함수 처리가 완료되기 전에 통신 회선 실패
08003 stmt가 연결되지 않거나 connection이 끊어진 상태
HY010 함수 연속 오류 주어진 stmt는 이 함수를 수행할 수 없음.
비동기 방식은 미지원.
24519 홀이 발견되었으나 지시자 변수가 없음
01S01 행에서 오류 발생 rowNumber가 0이었고, 작업 수행 중에 한 개 이상의 행에서 오류 발생
HY107 범위를 벗어난 행 값 rowNumber에 지정한 값이 행집합 내의 행의 개수보다 크다.
HY109 유효하지 않은 커서 위치
01001 커서 작업 충돌
HY024 유효하지 않은 배열 크기
21S02 테이블의 타입과 칼럼 개수가 칼럼 리스트와 일치하지 않음
HY092 유효하지 않은 속성/옵션
24000 올바르지 않은 커서 상태

관련 함수#

SQLBindCol
SQLBulkOperations
SQLCancel
SQLFetchScroll
SQLGetDescField
SQLGetDescRec
SQLSetDescField
SQLSetDescRec
SQLSetStmtAttr