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 ».

Exécution d’un lot d’instructions SQL (prise en charge des multi-instructions)

Dans ODBC, vous pouvez envoyer un lot d’instructions SQL (séparées par des points-virgules) à exécuter en une seule requête. Par exemple :

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

Pour envoyer un lot d’instructions avec le pilote ODBC Snowflake, vous devez spécifier le nombre d’instructions dans le lot. La base de données Snowflake nécessite le nombre exact d’instructions afin de se prémunir contre les attaques par injection SQL .

La section suivante explique comment spécifier le nombre d’instructions dans un lot.

Spécification du nombre d’instructions dans un lot

Par défaut, la base de données Snowflake attend du pilote qu’il prépare et envoie une seule instruction pour son exécution.

Vous pouvez remplacer cela en spécifiant le nombre d’instructions dans un lot pour une demande donnée ou en activant plusieurs instructions pour la session ou le compte en cours :

  • Pour spécifier ce nombre pour une requête donnée, appelez SqlSetStmtAttr afin de définir l’attribut SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT sur le nombre d’instructions dans le lot.

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

    Si vous souhaitez utiliser le paramètre pour la session ou le compte en cours (plutôt que de spécifier le nombre pour la demande), définissez SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT sur -1.

  • Pour activer plusieurs instructions pour la session ou le compte en cours, modifiez la session ou le compte et définissez le paramètre Snowflake MULTI_STATEMENT_COUNT sur 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;
    

    Par défaut, MULTI_STATEMENT_COUNT est défini sur 1 , ce qui indique qu’une seule instruction SQL peut être exécutée.

    Remarque : la définition du paramètre MULTI_STATEMENT_COUNT au niveau du compte affecte également les autres connecteurs et pilotes Snowflake qui utilisent le compte (par exemple le pilote Snowflake JDBC).

Préparation d’un lot d’instructions SQL

Le pilote ODBC prend en charge la possibilité de préparer un lot d’instructions SQL (par exemple, en appelant la fonction SQLPrepare). Remarques :

  • Si les instructions ont des paramètres, l’appel de la fonction SQLNumParams renvoie le nombre total de paramètres dans toutes les instructions du lot.

  • Les informations de colonne sur le jeu de résultats (par exemple, les données renvoyées par SQLNumResultCols, SQLDescribeCol, SQLColAttribute et SQLColAttributes) ne sont pas disponibles tant que vous n’appelez pas SQLExecute ou SQLExecDirect. (Le simple fait d’appeler SQLPrepare ne rend pas ces informations disponibles.)

Limites

Les commandes GET et PUT ne sont pas prises en charge dans les lots d’instructions SQL. Lorsque vous envoyez un lot d’instructions SQL avec des commentaires GET et PUT à exécuter, les commandes GET et PUT sont ignorées et aucune erreur n’est signalée.

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 diffusant les données (sans créer de fichiers sur la machine locale) 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.