Utilisation du pilote ODBC

Ce chapitre fournit des informations sur l’utilisation du pilote ODBC.

Dans ce chapitre :

Compilation de votre code

Linux

  • Si une application C/C++ est créée avec la bibliothèque de pilotes Snowflake ODBC et charge une bibliothèque non compatible pthread, l’application peut se bloquer en raison d’un accès simultané dangereux à la mémoire partagée. Pour éviter cela, compilez l’application avec l’option qui garantit que seules les bibliothèques compatibles pthread sont chargées avec l’application.

    Pour gcc/g ++, l’option est « -pthread ».

macOS

  • Si une application C/C++ est créée avec la bibliothèque de pilotes Snowflake ODBC et charge une bibliothèque non compatible pthread, l’application peut se bloquer en raison d’un accès simultané dangereux à la mémoire partagée. Pour éviter cela, compilez l’application avec l’option qui garantit que seules les bibliothèques compatibles pthread sont chargées avec l’application.

    Pour clang/clang++, l’option est « -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.

Liaison de paramètres aux variables de tableau pour les insertions par lots

Dans le code de votre application, vous pouvez insérer plusieurs lignes dans un seul lot en liant des paramètres dans une instruction INSERT à des variables de tableau.

À titre d’exemple, le code suivant insère des lignes dans une table qui contient une colonne INTEGER et une colonne VARCHAR. L’exemple lie les tableaux aux paramètres dans l’instruction 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);

Lorsque vous utilisez cette technique pour insérer un grand nombre de valeurs, le pilote peut améliorer les performances en envoyant les données vers une zone de préparation temporaire pour l’acquisition. Le pilote le fait automatiquement lorsque le nombre de valeurs dépasse un seuil.

Pour que le pilote envoie les données vers une zone de préparation temporaire, l’utilisateur doit disposer du privilège suivant sur le schéma :

  • CREATE STAGE.

Si l’utilisateur ne dispose pas de ce privilège, le pilote revient à l’envoi des données avec la requête à la base de données Snowflake.

En outre, la base de données et le schéma actuels de la session doivent être définis. Si ceux-ci ne sont pas définis, la commande CREATE TEMPORARY STAGE exécutée par le pilote peut échouer avec l’erreur suivante :

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.

Note

Pour découvrir d’autres moyens de charger des données dans la base de données Snowflake (y compris le chargement en masse à l’aide de la commande COPY), consultez Chargement de données dans Snowflake.