Uso do driver ODBC

Este tópico fornece informações sobre como usar o driver ODBC.

Neste tópico:

Compilação do código

Linux

  • Se um aplicativo C/C++ for construído com a biblioteca do driver Snowflake ODBC e carregar uma biblioteca não compatível com pthread, ele poderá travar devido ao acesso simultâneo inseguro à memória compartilhada. Para evitar isso, compile o aplicativo com a opção que garante que somente bibliotecas compatíveis com pthread sejam carregadas com o aplicativo.

    Para gcc/g++, a opção é “-pthread”.

macOS

  • Se um aplicativo C/C++ for construído com a biblioteca do driver Snowflake ODBC e carregar uma biblioteca não compatível com pthread, ele poderá travar devido ao acesso simultâneo inseguro à memória compartilhada. Para evitar isso, compile o aplicativo com a opção que garante que somente bibliotecas compatíveis com pthread sejam carregadas com o aplicativo.

    Para clang/clang++, a opção é “-pthread”.

Execução de um lote de instruções SQL (suporte para múltiplas instruções)

No ODBC, você pode enviar um lote de instruções SQL (separadas por ponto e vírgula) a serem executadas em uma única solicitação. Por exemplo:

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

Para enviar um lote de instruções com o driver ODBC do Snowflake, você deve especificar o número de instruções no lote. O banco de dados Snowflake requer o número exato de instruções para se proteger contra ataques de injeção SQL.

A próxima seção explica como especificar o número de instruções em um lote.

Especificação do número de instruções em um lote

Por padrão, o banco de dados Snowflake espera que o driver prepare e envie uma única instrução para execução.

Você pode substituir isto especificando o número de instruções em um lote para uma determinada solicitação ou permitindo múltiplas instruções para a sessão ou conta atual:

  • Para especificar o número para uma determinada solicitação, chame SqlSetStmtAttr para definir o atributo SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT para o número de instruções no lote.

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

    Se você quiser usar a configuração para a sessão ou conta atual (em vez de especificar o número para a solicitação), defina SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNT para -1.

  • Para habilitar múltiplas instruções para a sessão ou conta atual, alterar a sessão ou conta e definir o parâmetro Snowflake MULTI_STATEMENT_COUNT para 0.

    Use:

    alter session set MULTI_STATEMENT_COUNT = 0;
    
    Copy

    ou:

    alter account set MULTI_STATEMENT_COUNT = 0;
    
    Copy

    Por padrão, MULTI_STATEMENT_COUNT é definido como 1, o que indica que somente uma instrução SQL pode ser executada.

    Nota: A definição do parâmetro MULTI_STATEMENT_COUNT no nível da conta também afeta outros conectores e drivers do Snowflake que usam a conta (por exemplo, o driver JDBC do Snowflake).

Preparação de um lote de instruções SQL

O driver ODBC suporta a capacidade de preparar um lote de instruções SQL (por exemplo, chamando a função SQLPrepare). Observe o seguinte:

  • Se as instruções tiverem parâmetros, chamar a função SQLNumParams retorna o número total de parâmetros em todas as instruções do lote.

  • Informações de coluna sobre o conjunto de resultados (por exemplo, dados retornados por SQLNumResultCols, SQLDescribeCol, SQLColAttribute e SQLColAttributes) estão disponíveis quando você chama SQLExecute ou SQLExecDirect.

    Embora algumas informações de coluna estejam disponíveis quando você chama SQLPrepare, as informações podem não ser completamente precisas, e chamadas subsequentes para SQLExecute ou SQLExecDirect podem fornecer informações mais precisas.

Limitações

Comandos GET e PUT não têm suporte em lotes de instruções SQL. Quando você envia um lote de instruções SQL com comentários GET e PUT a serem executados, os comandos GET e PUT são ignorados, e nenhum erro é relatado.

Vinculação de parâmetros a variáveis de matriz para inserções em lote

No código de seu aplicativo, você pode inserir várias linhas em um único lote vinculando parâmetros em uma instrução INSERT para variáveis de matriz.

Como exemplo, o seguinte código insere linhas em uma tabela que contém uma coluna INTEGER e uma coluna VARCHAR. O exemplo vincula as matrizes aos parâmetros da instrução 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

Quando você usa esta técnica para inserir um grande número de valores, o driver pode melhorar o desempenho ao transmitir os dados (sem criar arquivos na máquina local) para um estágio temporário de ingestão. O driver faz isso automaticamente quando o número de valores excede um limite.

Além disso, o banco de dados e o esquema atual da sessão devem ser definidos. Se não forem definidos, o comando CREATE TEMPORARY STAGE executado pelo driver pode falhar com o seguinte erro:

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

Nota

Para formas alternativas de carregar dados no banco de dados Snowflake (incluindo carregamento em massa usando o comando COPY), consulte Carregamento de dados para o Snowflake.