ODBC 드라이버 사용하기

이 항목에서는 ODBC 드라이버의 사용 방법에 대한 정보를 제공합니다.

이 항목의 내용:

코드 컴파일하기

Linux

  • C/C++ 애플리케이션이 Snowflake ODBC 드라이버 라이브러리로 개발되고 pthread와 호환되지 않는 라이브러리를 로드하는 경우, 안전하지 않은 공유 메모리 동시 액세스로 인해 애플리케이션이 충돌할 수 있습니다. 이를 방지하려면 pthread 호환 라이브러리만 애플리케이션에 로드되는 옵션으로 애플리케이션을 컴파일하십시오.

    gcc/g++의 경우 이 옵션은 《-pthread》입니다.

macOS

  • C/C++ 애플리케이션이 Snowflake ODBC 드라이버 라이브러리로 개발되고 pthread와 호환되지 않는 라이브러리를 로드하는 경우, 안전하지 않은 공유 메모리 동시 액세스로 인해 애플리케이션이 충돌할 수 있습니다. 이를 방지하려면 pthread 호환 라이브러리만 애플리케이션에 로드되는 옵션으로 애플리케이션을 컴파일하십시오.

    clang/clang++의 경우 이 옵션은 《-pthread》입니다.

SQL 문 일괄 실행하기(다중 문 지원)

ODBC에서는 SQL 문의 일괄 처리(세미콜론으로 구분하여) 를 전송하여 단일 요청에서 실행되도록 할 수 있습니다. 예:

// Sending a batch of SQL statements to be executed
rc = SQLExecDirect(hstmt,
     (SQLCHAR *) "select c1 from t1; select c2 from t2; select c3 from t3",
     SQL_NTS);
Copy

Snowflake ODBC 드라이버를 통해 문의 일괄 처리를 전송하려면 배치의 문 개수를 반드시 지정해야 합니다. SQL 삽입 공격으로부터 보호하기 위해 Snowflake 데이터베이스에는 정확한 문의 개수가 필요합니다.

다음 섹션에서는 일괄 처리의 문 개수를 지정하는 방법을 설명합니다.

일괄 처리의 문 개수 지정하기

기본적으로, Snowflake 데이터베이스는 드라이버가 실행할 단일 문을 준비하여 전송할 것으로 예상합니다.

지정된 요청에서 일괄 처리의 문 개수를 지정하거나 현재 세션 또는 계정에서 다중 문을 활성화하여 이러한 설정을 재정의할 수 있습니다.

  • 지정된 요청에 대한 개수를 지정하려면 SqlSetStmtAttr 을 호출하여 SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT 속성을 일괄 처리의 문 개수로 설정합니다.

    // Specify that you want to execute a batch of 3 SQL statements
    rc = SQLSetStmtAttr(hstmt, SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT, (SQLPOINTER)3, 0);
    
    Copy

    현재 세션 또는 계정에 대한 설정을 사용하려면(요청에 대한 개수를 지정하지 않고) SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT-1 로 설정합니다.

  • 현재 세션 또는 계정에서 다중 문을 활성화하려면 세션 또는 계정을 변경하고 Snowflake MULTI_STATEMENT_COUNT 매개 변수를 0 으로 설정합니다.

    다음을 사용합니다.

    alter session set MULTI_STATEMENT_COUNT = 0;
    
    Copy

    또는:

    alter account set MULTI_STATEMENT_COUNT = 0;
    
    Copy

    기본적으로, MULTI_STATEMENT_COUNT1 로 설정되어 있으며, 이는 1개의 SQL 문만 실행이 가능함을 나타냅니다.

    참고: 계정 수준에 MULTI_STATEMENT_COUNT 매개 변수를 설정해도 해당 계정을 사용하는 다른 Snowflake 커넥터 및 드라이버(예: Snowflake JDBC 드라이버)에도 영향을 줍니다.

SQL 문의 일괄 처리 준비하기

ODBC 드라이버는 SQL 문의 일괄 처리(예: SQLPrepare 함수 호출)를 준비하는 기능을 지원합니다. 다음 사항을 참고하십시오.

  • 문에 매개 변수 가 있는 경우, SQLNumParams 함수를 호출하면 일괄 처리의 모든 문에 있는 총 매개 변수 개수가 반환됩니다.

  • 결과 세트에 대한 열 정보(예: SQLNumResultCols, SQLDescribeCol, SQLColAttribute 및 SQLColAttributes에서 반환된 데이터)는 SQLExecute 또는 SQLExecDirect를 호출할 때 제공됩니다.

    일부 열 정보는 SQLPrepare를 호출하여 얻을 수 있지만 정보가 완전하게 정확하지 않을 수 있으며 이후에 SQLExecute 또는 SQLExecDirect를 호출하여 제공되는 정보가 보다 정확할 수 있습니다.

제한 사항

GET 및 PUT 명령은 SQL 문의 일괄 처리에서 지원되지 않습니다. GET 및 PUT 명령과 함께 SQL 문의 일괄 처리를 실행하기 위해 전송하면 GET 및 PUT 명령이 무시되고 오류가 보고되지 않습니다.

일괄 삽입을 위해 매개 변수를 배열 변수에 바인딩하기

애플리케이션 코드에서 INSERT 문의 매개 변수를 배열 변수에 바인딩 하여 단일 일괄 처리에 여러 행을 삽입할 수 있습니다.

예를 들어, 다음 코드에서는 INTEGER 열 및 VARCHAR 열이 포함된 테이블에 행을 여러 개 삽입합니다. 이 예에서는 배열을 INSERT 문의 매개 변수에 바인딩합니다.

SQLCHAR * Statement = "INSERT INTO t (c1, c2) VALUES (?, ?)";

SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, ARRAY_SIZE, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_STATUS_PTR, ParamStatusArray, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &ParamsProcessed, 0);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,
                 IntValuesArray, 0, IntValuesIndArray);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, STR_VALUE_LEN - 1, 0,
                 StringValuesArray, STR_VALUE_LEN, StringValuesLenOrIndArray);
...
SQLExecDirect(hstmt, Statement, SQL_NTS);
Copy

이러한 방식을 사용하여 값을 대량으로 삽입하는 경우 드라이버는 수집을 위한 임시 스테이지로 데이터를 스트리밍하여(로컬 시스템에 파일을 생성하지 않음) 성능을 향상할 수 있습니다. 값의 개수가 임계값을 초과하는 경우 드라이버는 자동으로 이 작업을 수행합니다.

또한, 세션의 현재 데이터베이스 및 스키마를 설정해야 합니다. 이러한 값이 설정되지 않은 경우에는 드라이버가 실행하는 CREATE TEMPORARY STAGE 명령에서 다음 오류가 발생하며 실패할 수 있습니다.

CREATE TEMPORARY STAGE SYSTEM$BIND file_format=(type=csv field_optionally_enclosed_by='"')
Cannot perform CREATE STAGE. This session does not have a current schema. Call 'USE SCHEMA', or use a qualified name.
Copy

참고

Snowflake 데이터베이스에 데이터를 로드하는 대체 방법(COPY 명령을 사용한 대량 로드 등)과 관련해서는 Snowflake에 데이터 로딩하기 를 참조하십시오.