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);
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);
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;
ou:
alter account set MULTI_STATEMENT_COUNT = 0;
Por padrão,
MULTI_STATEMENT_COUNT
é definido como1
, 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);
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.
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.