ODBC ドライバーの使用

このトピックでは、 ODBC ドライバーの使用方法に関する情報を提供します。

このトピックの内容:

コードのコンパイル

Linux

  • Snowflake ODBC ドライバーライブラリを使用してC/C++アプリケーションを構築し、pthread非互換ライブラリをロードすると、共有メモリへの安全でない同時アクセスが原因でアプリケーションがクラッシュする可能性があります。これを防ぐには、pthread互換ライブラリのみがアプリケーションとともにロードされるようにするオプションを使用して、アプリケーションをコンパイルします。

    gcc/g++の場合、オプションは「-pthread」です。

macOS

  • Snowflake ODBC ドライバーライブラリを使用してC/C++アプリケーションを構築し、pthread非互換ライブラリをロードすると、共有メモリへの安全でない同時アクセスが原因でアプリケーションがクラッシュする可能性があります。これを防ぐには、pthread互換ライブラリのみがアプリケーションとともにロードされるようにするオプションを使用して、アプリケーションをコンパイルします。

    clang/clang++の場合、オプションは「-pthread」です。

Executing a Batch of SQL Statements

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);

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.

The next section explains how to specify the number of statements in a batch.

Specifying the Number of Statements in a Batch

By default, the Snowflake database expects the driver to prepare and send a single statement for execution.

You can override this by specifying the number of statements in a batch for a given request or by enabling multiple statements for the current session or account:

  • 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);
    

    If you want to use the setting for the current session or account (rather than specify the number for the request), set SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT to -1.

  • To enable multiple statements for the current session or account, alter the session or account, and set the Snowflake MULTI_STATEMENT_COUNT parameter to 0.

    -- Specify that you want to execute batches of multiple SQL statements
    -- for the current session.
    alter session set MULTI_STATEMENT_COUNT = 0;
    
     -- Specify that you want to execute batches of multiple SQL statements
     -- for the current account.
    alter account <account> set MULTI_STATEMENT_COUNT = 0;
    

    By default, MULTI_STATEMENT_COUNT is set to 1, which indicates that only one SQL statement can be executed.

    Note: Setting the MULTI_STATEMENT_COUNT parameter at the account level also affects other Snowflake connectors and drivers that use the account (e.g. the Snowflake JDBC Driver).

Preparing a Batch of SQL Statements

The ODBC Driver supports the ability to prepare a batch of SQL statements (e.g. by calling the SQLPrepare function). Note the following:

  • 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 not available until you call SQLExecute or SQLExecDirect. (Just calling SQLPrepare does not make this information available.)

Limitations

GET and PUT commands are not supported in batches of SQL statements. When you send a batch of SQL statements with GET and PUT comments to be executed, the GET and PUT commands are ignored, and no errors are reported.

バッチ挿入に対する配列変数へのパラメーターのバインド

アプリケーションコードでは、 INSERT ステートメントのパラメーターを配列変数にバインドすることにより、1つのバッチに複数の行を挿入できます。

例として、次のコードは、 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);

この手法を使用して多数の値を挿入する場合、ドライバーはデータを取り込みのために仮ステージに送信することにより、パフォーマンスを向上させることができます。値の数がしきい値を超えると、ドライバーはこれを自動的に実行します。

ドライバーによりデータを仮ステージに送信するには、ユーザーはスキーマに対して以下の権限を持っている必要があります。

  • CREATE STAGE

ユーザーにこの権限がない場合、ドライバーはフォールバックして、クエリを含むデータをSnowflakeデータベースに送信します。

さらに、セッションの現在のデータベースとスキーマを設定する必要があります。これらが設定されていない場合、ドライバーによって実行される 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.

注釈

データをSnowflakeデータベースにロードする別の方法( COPY コマンドを使用した一括ロードを含む)については、 Snowflakeへのデータのロード をご参照ください。