콘텐츠로 이동

SQLSetStmtAttr

SQLSetStmtAttr#

명령문 핸들과 관련된 속성을 설정한다.

Unicode SQLSetStmtAttrW() 동작은 SQLSetStmtAttr()와 동일하다.

구 문#

SQLRETURN  SQLSetStmtAttr (
    SQLHSTMT    stmt,
    SQLINTEGER  Attribute,
    SQLPOINTER  param,
    SQLINTEGER  StringLength );

인 자#

자료유형 인자 사용 설명
SQLHENV stmt 입력 명령문 핸들
SQLINTEGER Attribute 입력 설정할 속성. 지원되는 속성값은
- SQL_ATTR_CONCURRENCY
- SQL_ATTR_CURSOR_SCROLLABLE
- SQL_ATTR_CURSOR_SENSITIVITY
- SQL_ATTR_CURSOR_TYPE
- SQL_ATTR_PARAM_BIND_TYPE
- SQL_ATTR_PARAM_STATUS_PTR
- SQL_ATTR_PARAMS_PROCESSED_PTR
- SQL_ATTR_PARAMSET_SIZE
- SQL_ATTR_PREFETCH_ROWS
- SQL_ATTR_ROW_ARRAY_SIZE
- SQL_ATTR_ROW_BIND_TYPE
- SQL_ATTR_ROW_STATUS_PTR
- SQL_ATTR_ROWS_FETCHED_PTR
- ALTIBASE_STMT_ATTR_ATOMIC_ARRAY
- SQL_ATTR_FETCH_BOOKMARK_PTR
- SQL_ATTR_ROW_OPERATION_PTR
- SQL_ATTR_USE_BOOKMARKS
- SQL_ATTR_CURSOR_HOLD
- ALTIBASE_PREFETCH_AUTO_TUNING
- ALTIBASE_PREPARE_WITH_DESCRIBEPARAM

현재 지원되지 않는 속성값은
- SQL_ATTR_APP_PARAM_DESC
- SQL_ATTR_APP_ROW_DESC
- SQL_ATTR_ASYNC_ENABLE
- SQL_ATTR_ENABLE_AUTO_IPD
- SQL_ATTR_IMP_PARAM_DESC
- SQL_ATTR_IMP_ROW_DESC
- SQL_ATTR_KEYSET_SIZE
- SQL_ATTR_MAX_LENGTH
- SQL_ATTR_METADATA_ID
- SQL_ATTR_NOSCAN
- SQL_ATTR_PARAM_BIND_OFFSET_PTR
- SQL_ATTR_PARAM_OPERATION_PTR
- SQL_ATTR_QUERY_TIMEOUT
- SQL_ATTR_RETRIEVE_DATA
- SQL_ATTR_ROW_BIND_OFFSET_PTR
- SQL_ATTR_ROW_NUMBER
- SQL_ATTR_SIMULATE_CURSOR
SQLPOINTER param 입력 Attribute와 연관된 값의 포인터.
Attribute 값에 따라 param은 32 bit 부호 없는 정수 값이거나 null-terminated 문자열의 포인터, 바이너리 버퍼, 또는 ODBC에서 정의된 값
Attribute가 ODBC 고유의 값이면 param은 부호 표시 정수이다.
SQLINTEGER StringLength 입력 Attribute가 ODBC에서 정의된 속성이고 param이 문자열 또는 바이너리 버퍼를 가리키면 이 인자는 *param의 바이트 길이 여야만 한다.
Attribute가 ODBC에서 정의된 속성이고 param이 정수면 이 인자는 무시된다.

결괏값#

SQL_SUCCESS 
SQL_SUCCESS_WITH_INFO
SQL_INVALID_HANDLE  
SQL_ERROR

설 명#

명령문 속성은 다른 SQLSetStmtAttr() 호출에 의해 옵션이 변경되거나 명령문이 SQLFreeHandle()을 호출하여 stmt가 제거될 때까지 stmt에 대한 명령문 옵션은 효력이 있다. 핸들 해제 방식 SQL_CLOSE, SQL_UNBIND, 또는 SQL_RESET_PARAMS과 함께 SQLFreeStmt()를 호출하는 것은 명령문 속성을 재설정하지 않는다.

열 양식 바인딩을 사용하기 위해 애플리케이션은 함수 SQLSetStmtAttr()의 인자 Attribute에 SQL_ATTR_PARAM_BIND_TYPE을 설정하고 인자 param에 SQL_PARAM_BIND_BY_COLUMN을 설정한다. 만약 실행 도중 매번 ARRAY_SIZE가 변경된다면, PARAM_SIZE만 변경을 하면 된다.

PARAM_STATUS_PTR은 각 열들이 수행되었는지에 대한 여부를 돌려주기 위한 값으로 SQLSMALLINT의 배열로 지정한다. 성공하면 SQL_SUCCESS, SQL_SUCCESS_WITH_INFO가, 실패하면 SQL_PARAM_ERROR, 수행되지 않은 경우 SQL_PARAM_UNUSED가 반환된다. 매크로 값은 SQL_PARAM_SUCCESS은 0, SQL_PARAM_ERROR는 5, SQL_PARAM_SUCCESS_WITH_INFO는 6, SQL_PARAM_UNUSED는 7이다.

SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, ARRAY_SIZE, 0);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_STATUS_PTR, ParamStatusArray, 0);

PARAMS_PROCESSED_PTR에 처리된 열의 개수를 저장하기 위한 변수의 포인터를 지정한다. SQLINTEGER의 포인터형이다. 그 다음 기존처럼 SQLBindParameter()를 수행하면 된다.

SQLSetStmtAttr(stmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &ParamsProcessed, 0);

SQLBindParameter()를 수행

행 양식 바인딩을 사용할 때, 열 양식 바인딩과의 차이는 PARAM_BIND_TYPE에 structure의 크기를 지정하는 것이다.

SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_BIND_TYPE, sizeof(struct…));
SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, ARRAY_SIZE, 0);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_STATUS_PTR, ParamStatusArray, 0);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &ParamsProcessed, 0);

SQLBindParameter()를 수행

명령문 속성#

Attribute 내용
SQL_ATTR_CONCURRENCY 커서의 동시성 처리를 명시하는 SQLUINTEGER 값.
- SQL_CONCUR_READ_ONLY: 커서는 read-only이다. update는 허용하지 않는다.
- SQL_CONCUR_ROWVER: 행 버전으로 동시성 제어
- SQL_CONCUR_LOCK 및 SQL_CONCUR_VALUES는 미지원.
SQL_ATTR_CURSOR_SCROLLABLE 이 명령문 핸들에 대해 열린 커서를 스크롤할 수 있는지를 지정하는 32비트 정수 값.
SQL_ATTR_CURSOR_SENSITIVITY 명령문 핸들에 대해 열린 커서가 다른 커서가 변경한 내용을 볼 수 있는지 여부를 지정하는 32비트 정수 값.
SQL_INSENSITIVE 또는 SQL_SENSITIVE로 지정 가능.
SQL_UNSPECIFIED는 미지원.
SQL_ATTR_CURSOR_TYPE 커서 타입을 명시하는 SQLUINTEGER 값.
- SQL_CURSOR_FORWARD_ONLY: 커서는 순방향으로만 진행
- SQL_CURSOR_STATIC: 결과 집합 내의 데이터는 STATIC 이다.
- SQL_CURSOR_KEYSET_DRIVEN: 커서에 포함되는 행의 멤버와 순서가 고정적이다.
Altibase CLI 드라이버는 순수한 키집합 커서를 지원한다.
SQL_KEYSET_SIZE 명령문 속성은 무시된다.
SQL_ATTR_PARAM_BIND_TYPE (array binding 시 필요한 설정값) 이 필드는 열 양식 바인딩으로 검색하기 위해 SQL_PARAM_BIND_BY_COLUMN (기본값)이 설정된다.
행 양식 바인딩으로 검색하기 위해서는 구조의 길이나 동적 매개변수들이 바인드될 버퍼의 길이가 설정된다.
이 길이는 바인드된 매개변수 스페이스를 포함해야 한다.
SQL_ATTR_PARAM_STATUS_PTR (array binding 시 필요한 설정값) 이 필드는 PARAMSET_SIZE가 1 보다 클 때만 요구된다.
상태 값들은 다음 값들을 가질 수 있다:
- SQL_PARAM_SUCCESS: SQL 문이 성공적으로 수행된다.. 매크로 값은 0.
- SQL_PARAM_SUCCESS_WITH_INFO: SQL 문이 성공적으로 수행된다.; 그러나 경고 정보를 진단 데이터 구조에서 볼 수 있다. 매크로 값은 5.
- SQL_PARAM_ERROR: 매개변수들을 수행하는데 있어서 오류가 있다. 추가적인 오류 정보를 진단 데이터 구조에서 볼 수 있다. 매크로 값은 6.
- SQL_PARAM_UNUSED: 이 매개변수 집합은 사용되지 않는다. 아마도 이전 매개변수 집합이 추가 진행을 중단하는 오류를 야기했기 때문이다. 매크로 값은 7.
SQL_ATTR_PARAMS_PROCESSED_PTR (array binding 시 필요한 설정값) 오류를 포함한 매개변수 개수를 반환하는 버퍼를 가리킴.
null pointer이면 아무 값도 반환되지 않을 것이다.
SQLExecDirect() or SQLExecute()의 호출에 대해 SQL_SUCCESS 또는 SQL_SUCCESS_WITH_INFO이 반환되지 않는다면 버퍼의 내용은 정의되지 않는다.
SQL_ATTR_PARAMSET_SIZE (array binding 시 필요한 설정값) 각 매개변수에 대한 값들의 개수를 명시하는 SQLUINTEGER 값
SQL_ATTR_PREFETCH_ROWS 한 번의 Fetch 연산으로 서버에서 한 번에 가져올 행의 개수를 지정한다.
이 속성을 0으로 설정하면, CLI 드라이버는 한 네트워크 패킷에 담을 수 있는 최대 크기만큼 서버로부터 데이터를 가지고 온다.
설정 가능한 값의 범위는 0에서 2147483647이다.
SQL_ATTR_ROW_ARRAY_SIZE (SELECT 문에서 array fetch 할 때 필요한 설정값) 각 SQLFetch()을 호출 함으로서 반환되는 행들의 개수를 명시하는 SQLUINTEGER 값
SQL_ATTR_ROW_BIND_TYPE (SELECT 문에서 array fetch 할 때 필요한 설정값) SQLFetch()가 호출될 때 사용될 바인딩 방향을 설정하는 SQLUINTEGER 값.
열 양식 바인딩은 SQL_BIND_BY_COLUMN 값을 설정 함으로서 검색된다.
행 양식 바인딩은 구조의 길이나 결과 열들이 바인드될 버퍼의 길이를 설정 함으로서 검색된다.
길이가 명시된다면, 바인드될 열에 대해 스페이스를 포함해야만 한다.
SQL_ATTR_ROW_STATUS_PTR (SELECT 문에서 array fetch 할 때 필요한 설정값)배열의 크기는 행집합의 행의 수만큼 이다.
이 속성은 null pointer가 설정될 수 있고, 그런 경우 Altibase CLI 드라이버는 열 상태 값을 반환하지 않는다.
SQL_ATTR_ROWS_FETCHED_PTR (SELECT 문에서 array fetch 할 때 필요한 설정값) SQLFetch()를 호출 후에 페치된 행들의 수를 반환하는 버퍼를 가리키는 SQLUINTEGER * 값
ALTIBASE_STMT_ATTR_ATOMIC_ARRAY Altibase의 전용 속성으로, Atomic Array Insert를 수행한다.
일반적인 Array Insert가 구문들을 각각 처리하는 것과 비교해 Atomic Array Insert는 1개의 구문으로 여러 개의 구문을 처리한다.
Attribute에 ALTIBASE_STMT_ATTR_ATOMIC_ARRAY를 설정하고 인자 param에 SQL_TRUE 또는 SQL_FALSE를 설정한다.
SQL_TRUE를 설정하면 Atomic Array Insert를 실행한다. 그러나 Atomic Array Insert가 기존의 Array Insert보다 빠른 성능을 발휘하기 위해선 Array Size(SQL_ATTR_PARAMSET_SIZE) 를 지정한다. 또한 다음의 속성들과 함께 사용해 결괏값을 저장할 수 있다.
- SQL_ATTR_PARAM_STATUS_PRT : 1번째 로우 자리에만 실제 결괏값이 저장되고 나머지는 모두 성공으로 처리된다.
- SQL_ATTR_PARAMS_PROCESSED_PTR : 1번째 로우 자리에만 실제 결괏값 저장되고 나머지는 정의되지 않는다.
SQL_ATTR_FETCH_BOOKMARK_PTR 바이너리 북마크 값을 담고 있는 버퍼를 가리키는 포인터.
SQL_FETCH_BOOKMARK로 SQLFetchScroll을 호출하면, 드라이버는 이 속성으로 설정한 북마크 값을 사용해서 행을 스크롤한다.
이 속성의 기본값은 null 포인터이다.
이 속성으로 설정한 북마크 값은 SQLBulkOperations가 북마크로 삭제, 갱신, 또는 fetch할 때 사용되지는 않는다. SQLBulkOperations은 행집합 버퍼에 캐시된 북마크를 사용한다.
SQL_ATTR_ROW_OPERATION_PTR SQLSetPos를 이용한 벌크 작업 중에 어떤 행을 작업할 것인지 무시할 것인지를 지정하기 위한 SQLUSMALLINT 값들의 배열을 가리키는 포인터.
- SQL_ROW_IGNORE: 벌크 작업에서 제외할 행
- SQL_ROW_PROCEED: 벌크 작업에 포함할 행. SQLBulkOperations 수행 중에는 이 배열의 값이 적용되지 않는다.
SQL_ATTR_USE_BOOKMARKS 북마크 사용 여부를 설정하는 SQLULEN 값.
- SQL_UB_OFF: 기본값
- SQL_UB_ON 또는 SQL_UB_FIXED: 고정 길이(4bytes) 북마크 사용
- SQL_UB_VARIABLE: 가변 길이 북마크 사용
SQL_ATTR_CURSOR_HOLD 열린 커서에서 트랜잭션 완료 효과를 제어하는 SQLULEN 값.
- SQL_CURSOR_HOLD_ON: 트랜잭션 커밋 시 커서가 닫히지 않는다.
- SQL_CURSOR_HOLD_OFF: 트랜잭션 커밋 시 커서가 닫힌다.(기본값)
ALTIBASE_PREFETCH_ASYNC 비동기적으로 prefetch를 수행하여 fetch 성능을 향상시킨다.
TCP, SSL 접속에서만 사용할 수 있다.
- ALTIBASE_PREFETCH_ASYNC_OFF: 동기적으로 prefetch를 수행한다.(기본값)
- ALTIBASE_PREFETCH_ASYNC_PREFERRED: 비동기적으로 prefetch를 수행한다. 명령문마다 비동기 prefetch 하도록 설정할 수 있지만 접속 당 하나의 명령문만 prefetch가 비동기적으로 수행된다.
ALTIBASE_PREFETCH_AUTO_TUNING 비동기적으로 prefetch를 수행할 경우, 네트워크 상태에 따라 auto-tuning 할 것인지 여부를 지정한다.
Auto-tuning이란 네트워크 상태에 따라 prefetch row 개수를 자동으로 조절해주는 기능이다. 이 기능은 리눅스에서만 사용할 수 있다.
- ALTIBASE_PREFETCH_AUTO_TUNING_OFF: auto-tuning 기능을 사용하지 않는다. (리눅스 이외의 OS에서 기본값)
- ALTIBASE_PREFETCH_AUTO_TUNING_ON: auto-tuning 기능을 사용한다. (리눅스에서 기본값)
ALTIBASE_PREPARE_WITH_DESCRIBEPARAM Prepare시 매개변수(parameter) 정보를 같이 요청해서 네트워크 I/O 비용을 줄이기 위한 속성이다.
매개변수 정보가 필요한 경우 사용하면 성능을 향상시킬 수 있다.
- ALTIBASE_PREPARE_WITH_DESCRIBEPARAM_OFF: Prepare시 매개변수 정보를 요청하지 않는다.(기본값)
- ALTIBASE_PREPARE_WITH_DESCRIBEPARAM_ON: Prepare시 매개변수 정보를 같이 요청한다.

진 단#

SQLSTATE 설명 부연설명
HY000 일반 오류
24000 올바르지 않은 커서 상태
HY010 함수 순서 오류
HY011 현재는 속성 설정 불가능
HY013 메모리 관리 오류
HYC00 지원하지 않는 속성 사용 인자 Attribute에 명시된 값이 드라이버가 지원 안 하는 값이다.
HY009 null 포인터의 유효하지 않은 사용
HY017 자동으로 할당되는 descriptor 핸들의 유효하지 않은 사용
01S02 미지원 옵션 값 사용
HY024 유효하지 않은 속성 값 명시한 Attribute에 대해 유효하지 않은 값이 지정되었다.
HY024 유효하지 않은 배열 크기

예 제#

< $ALTIBASE_HOME/sample/SQLCLI/demo_ex4.cpp 참고 >

SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_BIND_TYPE, (void*)sizeof(demo_ex4_data), 0);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (void*)10, 0);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAMS_PROCESSED_PTR,(void*) &processed_ptr, 0);
SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_STATUS_PTR, (void*)status, 0);
Automic Array Insert를 사용한다.
SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) array_size, 0); // Array Size를 지정한다.
SQLSetStmtAttr(stmt, ALTIBASE_STMT_ATTR_ATOMIC_ARRAY, (SQLPOINTER) SQL_TRUE, 0); // Atomic 속성을 지정한다.
아래는 커서 타입을 지정하는 예제 코드이다.
...
SQLAllocStmt(sDbc, &sStmt);
SQLSetStmtAttr(sStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, NULL);
SQLSetStmtAttr(sStmt, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) sRowStatus, NULL);

/* ... */

SQLExecDirect(sStmt, (SQLCHAR *)"SELECT t1.* FROM t1", SQL_NTS);
while (1)
{
    sRC = SQLFetch(sStmt);
    if (! SQL_SUCCEEDED(sRC))
    {
    break;
    }
    if (sRowStatus == SQL_ROW_DELETED)
    {
    /* hole */
    }
    else
    {
    /* todo */
    }
}
...