ODBC 드라이버 사용하기

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

이 항목의 내용:

코드 컴파일하기

Linux

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

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

macOS

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

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

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

In ODBC, you can send a batch of SQL statements (separated by semicolons) to be executed in a single request. For example:

// 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

To send a batch of statements with the Snowflake ODBC Driver, you must specify the number of statements in the batch. The Snowflake database requires the exact number of statements in order to guard against SQL injection attacks.

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

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

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

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

  • To specify the number for a given request, call SqlSetStmtAttr to set the SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT attribute to the number of statements in the batch.

    // 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 함수 호출)를 준비하는 기능을 지원합니다. 다음 사항을 참고하십시오.

  • If the statements have parameters, calling the SQLNumParams function returns the total number of parameters in all the statements in the batch.

  • Column information about the result set (e.g. data returned by SQLNumResultCols, SQLDescribeCol, SQLColAttribute and SQLColAttributes) is available when you call SQLExecute or 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에 데이터 로딩하기 를 참조하십시오.