콘텐츠로 이동

4. 커서 사용#

이 장은 Altibase CLI 드라이버가 제공하는 커서의 사용법을 설명한다.

커서 특성#

Altibase CLI 드라이버의 커서는 다음을 지원한다:

  • 여러 유형의 커서

  • 커서 내에서 스크롤 및 위치 지정

  • 여러 가지 동시성 옵션

  • 위치 지정 업데이트

커서의 특성은 SQL문을 실행하기 전에 SQLSetStmtAttr로 설정한 명령문 속성에 의해 제어된다. 결과 집합을 처리하는 Altibase CLI API 함수들은 fetch, 스크롤, 및 위치 지정 업데이트 같은 커서의 기능을 지원한다.

커서 특성 설정#

애플리케이션에서 SQL문을 실행하기 전에 하나 이상의 커서 속성을 설정하여 커서의 동작을 제어할 수 있다. ODBC 표준에는 커서의 특성을 지정하는 아래의 두 가지 방법이 있다.

  • 커서 유형
    커서 유형은 SQLSetStmtAttr의 SQL_ATTR_CURSOR_TYPE 속성을 사용하여 설정할 수 있다. Altibase CLI 드라이버는 정방향 전용(forward-only), 정적(static), 및 키집합(keyset-driven) 커서 유형을 지원한다.

  • 커서 동작
    커서 동작은 SQLSetStmtAttr의 SQL_ATTR_CURSOR_SCROLLABLE, SQL_ATTR_CURSOR_SENSITIVITY, 및 SQL_ATTR_CONCURRENCY 속성을 사용하여 설정할 수 있다.

커서 유형은 ODBC 스타일이며, 커서 동작은 SQL-92/ISO 스타일이다.

커서 유형#

Altibase CLI 드라이버는 아래 세 가지 유형의 커서를 지원한다.

  • 정방향 전용 커서
    스크롤을 지원하지 않으며, 커서의 처음부터 끝까지 순차적으로 행을 fetch하는 것만 지원한다.

  • 정적 커서
    커서가 열릴 당시의 결과 집합을 표시하며, 읽기 전용이다.

  • 키 집합 커서
    행 순서는 커서가 열릴 때 고정된다. 키가 아닌 칼럼의 데이터 수정 내용은 커서를 통해 볼 수 있다.

커서 동작#

SQLSetStmtAttr의 SQL_ATTR_CURSOR_SCROLLABLE, SQL_ATTR_CURSOR_SENSITIVITY, 및 SQL_ATTR_CONCURRENCY 속성을 사용해서 커서의 스크롤 가능 여부, 민감도, 및 동시성을 지정할 수 있다.

  • 스크롤 가능 여부
    SQL_ATTR_CURSOR_SCROLLABLE이 SQL_SCROLLABLE로 설정되면, 커서는 여러 방향으로 이동 가능하다. SQL_ATTR_CURSOR_SCROLLABLE이 SQL_NONSCROLLABLE로 설정되면, 커서는 SQL_FETCH_NEXT로만 움직일 수 있다.

  • 민감도
    SQL_ATTR_CURSOR_SENSITIVITY가 SQL_SENSITIVE로 설정되면, 커서는 데이터베이스의 데이터 수정 내용을 반영한다. 즉, 행 집합을 다시 가져올 필요가 경우, 데이터베이스에서 최신 데이터를 가져온다. SQL_ATTR_CURSOR_SENSITIVITY가 SQL_INSENSITIVE로 설정되면, 커서는 데이터 수정 내용을 반영하지 않는다. 즉, 행 집합을 다시 가져올 필요가 경우, 캐시에서 데이터를 가져온다.

  • 동시성
    커서의 동시성은 SQLSetStmtAttr에 SQL_ATTR_CONCURRENCY 속성을 사용하여 설정된다. Altibase CLI 드라이버는 아래 두 가지 유형의 커서 동시성을 지원한다.

    • SQL_CONCUR_READONLY: 읽기 전용

    • SQL_CONCUR_ROWVER: 행 버전을 사용하여 동시성 제어

암시적 커서 변환#

애플리케이션은 커서 유형을 지정하는 대신에 커서 동작 관련 속성들을 일일이 지정할 수도 있다. 그 방법은 명령문 핸들에 대해 커서를 열기 전에 SQL_ATTR_CURSOR_SCROLLABLE, SQL_ATTR_CURSOR_SENSITIVITY, 및 SQL_ATTR_CONCURRENCY 명령문 속성을 설정하는 것이다. 그러면 Altibase CLI 드라이버가 애플리케이션에서 요청한 특성을 가장 효율적으로 제공하는 커서 유형을 선택한다.

애플리케이션이 SQL_ATTR_CURSOR_SCROLLABLE, SQL_ATTR_CURSOR_SENSITIVITY, SQL_ATTR_CONCURRENCY, 또는 SQL_ATTR_CURSOR_TYPE 명령문 속성 중 어떤 것을 설정할 때마다, 드라이버는 네 가지 속성 값들이 양립하도록 다른 속성 값을 변경한다. 즉, 애플리케이션이 커서 동작 관련 속성을 지정하면, 드라이버는 암시적 선택에 기반하여 커서 유형을 나타내는 속성을 변경할 수 있다. 그리고, 애플리케이션이 커서 유형을 지정하면, 드라이버는 선택된 커서 유형의 특성에 부합하도록 다른 속성들을 변경할 수 있다.

애플리케이션이 커서 유형과 커서 동작 속성을 모두 지정하면 의도하지 않은 특성의 커서를 얻을 수 있으므로 주의가 필요하다.

아래의 표는 커서 유형별 기본 커서 동작을 보여준다.

커서 유형 민감도 스크롤 가능 여부 동시성
정방향 전용 (forward-only) insensitive non-scrollable read-only
정적 (static) insensitive scrollable read-only
키집합 (keyset-driven) sensitive scrollable updatable
동적 (dynamic) - - -

Altibase CLI 드라이버는 동적 커서는 지원하지 않는다. 또한, 정방향 전용과 정적 커서의 경우, 위 표의 조합 외에 다른 동작의 조합은 지원하지 않는다. 키 집합 커서의 경우, 위 표의 조합 외에 (SENSITIVE, SCROLLABLE, READ-ONLY) 조합을 지원한다.

커서 변환 규칙은 아래와 같다.

  • 사용자가 지정한 커서 속성이 커서 유형과 부합하지 않으면, 드라이버는 커서 유형을 아래의 순서로 변환한다.

    • dynamic → keyset-driven → static → foward-only
  • 애플리케이션이 커서 유형을 지정하면, 드라이버는 선택된 유형의 특성에 부합할 때까지 다른 속성들을 아래의 순서로 변환한다.

    • sensitive → insensitive

    • scrollable → non-scrollable

    • updatable → read-only


행 스크롤 및 Fetch#

스크롤 가능한 커서를 사용하려면 Altibase CLI 애플리케이션에서 다음을 수행해야 한다.

  • SQLSetStmtAttr을 사용하여 커서 속성을 설정한다.

  • SQLExecute 또는 SQLExecDirect를 사용하여 커서를 연다.

  • SQLFetch 또는 SQLFetchScroll을 이용하여 행을 스크롤하고 가져온다.

ODBC 커서는 한 번에 한 행씩만 가져가도록 제한하지는 않는다. SQLFetch 또는 SQLFetchScroll을 호출할 때마다 여러 행을 가져올 수 있다. ODBC 응용 프로그램 같은 클라이언트/서버 구조의 데이터베이스 작업 시에는 한 번에 여러 행을 가져오는 것이 효율적이다. fetch 시 반환되는 행의 수를 행 집합 크기라고 하며 SQLSetStmtAttr의 SQL_ATTR_ROW_ARRAY_SIZE를 사용하여 지정할 수 있다.

행 집합 크기가 1보다 큰 커서를 블록 커서라고 하며, 배열 바인딩을 사용해서 블록 커서에서 데이터를 검색할 수 있다. 이에 대한 자세한 내용은 2장의 SQLFetch 함수를 참고한다.

SQLFetch는 정방향 전용 커서만 사용 가능하며, SQLFetchScroll는 커서를 여러 방향으로 이동할 수 있다.

행 집합에 북마크 설정#

북마크는 데이터의 행을 식별하는 데 사용되는 값이다. Altibase CLI 애플리케이션에서는 특정 행에 대해 북마크를 요청하고 이를 저장한 다음 다시 이것을 커서에 전달하여 그 행으로 돌아간다.

SQLFetchScroll을 사용하여 행을 가져올 때, 애플리케이션에서는 시작 행을 선택하기 위한 기준으로 북마크를 사용할 수 있다. 이 북마크는 현재 커서 위치를 사용하지 않기 때문에 절대 주소 형태로 되어 있다. 애플리케이션에서는 SQL_FETCH_BOOKMARK로 SQLFetchScroll을 호출하여 북마크가 표시된 행으로 스크롤할 수 있다. 이 작업은 SQL_ATTR_FETCH_BOOKMARK_PTR 명령문 속성으로 설정한 북마크를 사용한다. 즉, 북마크로 식별된 행부터 행집합을 반환한다. 애플리케이션에서 SQLFetchScroll 호출 시 인자에 오프셋을 지정할 수 있다. 오프셋이 지정되면, 반환되는 행집합의 첫 번째 행은 북마크로 식별된 행에서 오프셋 수만큼 더하여 결정된다. Altibase CLI 드라이버는 정적 및 키집합 커서에 대해서만 북마크를 지원한다. 북마크가 설정되어 있을 때, 동적 커서가 요청되면 키집합 커서가 대신 열린다.


제약 사항#

Altibase CLI 드라이버의 커서를 사용하려면, 결과 집합을 가져오는 SELECT 문에 아래와 같은 제약 사항이 있다.

  • FROM 절에 한 개의 테이블만 지정할 수 있다.

  • ORDER BY 절에 반드시 칼럼 이름을 명시해야 한다.

커서 지정 업데이트 수행을 하기 위해서는 아래의 제약 사항이 추가된다.

  • FROM 절에 일반 테이블만 지정할 수 있다.

  • SELECT 리스트에 순수 칼럼만 지정할 수 있다. 수식 또는 함수가 포함될 수 없다. 그리고, NOT NULL 제약조건이 있으면서 DEFAULT값이 없는 칼럼은 SELECT 리스트에 반드시 포함되어야 한다.