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)¶
Nota
A execução de várias instruções em uma única consulta requer que um warehouse válido esteja disponível em uma sessão.
No ODBC, você pode enviar um lote de instruções SQL (separadas por ponto e vírgula) a executar em uma única solicitação. O exemplo a seguir envia um lote de três instruções SELECT:
// 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 mais informações sobre o envio de lotes de instruções SQL, veja Lotes de instruções SQL.
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.
Para obter mais informações sobre esses tipos de ataques, consulte injeção de 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 atributoSQL_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 obter mais informações, consulte a documentação SqlSetStmtAttr.
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, a chamada da função
SQLNumParams
retornará o número total de parâmetros em todas as instruções do lote.Para obter mais informações sobre parâmetros e a função
SQLNumParams
, consulte parâmetros da instrução e função SQLNumParams.Informações de coluna sobre o conjunto de resultados (por exemplo, dados retornados por
SQLNumResultCols
,SQLDescribeCol
,SQLColAttribute
eSQLColAttributes
) estão disponíveis quando você chamaSQLExecute
ouSQLExecDirect
.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.