Verwenden des ODBC-Treibers

Unter diesem Thema werden Informationen zur Verwendung des ODBC-Treibers bereitgestellt.

Unter diesem Thema:

Kompilieren von Code

Linux

  • Wenn eine C/C++-Anwendung mit der Snowflake-ODBC-Treiberbibliothek erstellt wird und eine Bibliothek lädt, die nicht mit pthread kompatibel ist, kann die Anwendung aufgrund eines unsicheren gleichzeitigen Zugriffs auf den gemeinsam genutzten Speicher abstürzen. Um dies zu verhindern, kompilieren Sie die Anwendung mit der Option, die sicherstellt, dass nur pthread-kompatible Bibliotheken mit der Anwendung geladen werden.

    Für gcc/g++ lautet die Option „-pthread“.

macOS

  • Wenn eine C/C++-Anwendung mit der Snowflake-ODBC-Treiberbibliothek erstellt wird und eine Bibliothek lädt, die nicht mit pthread kompatibel ist, kann die Anwendung aufgrund eines unsicheren gleichzeitigen Zugriffs auf den gemeinsam genutzten Speicher abstürzen. Um dies zu verhindern, kompilieren Sie die Anwendung mit der Option, die sicherstellt, dass nur pthread-kompatible Bibliotheken mit der Anwendung geladen werden.

    Für clang/clang++ lautet die Option „-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.

Binden von Parametern an Array-Variablen für Batcheinfügungen

In Ihrem Anwendungscode können Sie mehrere Zeilen in einen einzelnen Batch einfügen, indem Sie Parameter in einer INSERT-Anweisung an Array-Variablen binden.

Der folgende Code fügt beispielsweise Zeilen in eine Tabelle ein, die eine INTEGER-Spalte und eine VARCHAR-Spalte enthält. Im Beispiel werden die Parameter in der INSERT-Anweisung an Arrays gebunden.

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

Wenn Sie dieses Verfahren verwenden, um eine große Anzahl von Werten einzufügen, kann die Treiberleistung verbessert werden, indem er die Daten zur Erfassung an einen temporären Stagingbereich gesendet werden. Der Treiber führt dies automatisch durch, wenn die Anzahl der Werte einen Schwellenwert überschreitet.

Damit der Treiber die Daten an einen temporären Stagingbereich senden kann, muss der Benutzer über die folgende Berechtigung für das Schema verfügen:

  • CREATE STAGE.

Wenn der Benutzer nicht über diese Berechtigung verfügt, sendet der Treiber die Daten mit der Abfrage an die Snowflake-Datenbank zurück.

Außerdem müssen die aktuelle Datenbank und das aktuelle Schema für die Sitzung festgelegt sein. Wenn diese nicht festgelegt sind, kann der vom Treiber ausgeführte CREATE TEMPORARY STAGE-Befehl folgenden Fehler generieren:

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.

Bemerkung

Alternative Möglichkeiten zum Laden von Daten in die Snowflake-Datenbank (einschließlich Massenladen mit dem COPY-Befehl) finden Sie unter Laden von Daten in Snowflake.