Consumo de resultados

Retorno de resultados em linha

A maneira mais comum de consumir resultados é passar um retorno de chamada complete para connection.execute(). Quando a instrução tiver terminado a execução e o resultado estiver pronto para ser consumido, o retorno de chamada complete é invocado com as linhas de resultado retornadas em linha:

connection.execute({
  sqlText: 'SELECT * FROM sometable',
  complete: function(err, stmt, rows) {
    if (err) {
      console.error('Failed to execute statement due to the following error: ' + err.message);
    } else {
      console.log('Number of rows produced: ' + rows.length);
    }
  }
});
Copy

Transmissão de resultados

Também é possível consumir um resultado como um fluxo de linhas. Isto pode ser feito chamando o método statement.streamRows(); isto retorna um fluxo Node.js Readable que pode ser usado para consumir linhas conforme elas são recebidas. Para obter mais informações sobre o fluxo Readable, consulte a documentação do Node.js.

Por exemplo:

var statement = connection.execute({
  sqlText: 'SELECT * FROM sometable'
});

var stream = statement.streamRows();

stream.on('error', function(err) {
  console.error('Unable to consume all rows');
});

stream.on('data', function(row) {
  // consume result row...
});

stream.on('end', function() {
  console.log('All rows consumed');
});
Copy

Processamento em lote de resultados

Por padrão, o método statement.streamRows() produz um fluxo que inclui cada linha do resultado. Entretanto, se você quiser consumir apenas um subconjunto do resultado, ou se quiser consumir linhas de resultados em lotes, pode chamar streamRows() com argumentos start e end. Quando estas opções adicionais são especificadas, apenas as linhas no intervalo solicitado são transmitidas:

connection.execute({
  sqlText: 'SELECT * FROM sometable',
  streamResult: true, // prevent rows from being returned inline in the complete callback
  complete: function(err, stmt, rows) {
    // no rows returned inline because streamResult was set to true
    console.log('rows: ' + rows); // 'rows: undefined'

    // only consume at most the last 5 rows in the result
    rows = [];
    stmt.streamRows({
      start: Math.max(0, stmt.getNumRows() - 5),
      end: stmt.getNumRows() - 1,
    })
    .on('error', function(err) {
      console.error('Unable to consume requested rows');
    })
    .on('data', function(row) {
      rows.push(row);
    })
    .on('end', function() {
      console.log('Number of rows consumed: ' + rows.length);
    });
  }
})
Copy

Conversão do tipo de dados

Quando linhas de resultados são produzidas, o driver automaticamente mapeia tipos de dados SQL para seus equivalentes JavaScript correspondentes. Por exemplo, os valores do tipo TIMESTAMP e DATE são retornados como objetos de data JavaScript.

Para o mapeamento completo dos tipos de dados JavaScript para SQL, consulte a tabela abaixo:

Tipo de dados SQL

Tipo de dados JavaScript

Notas

VARCHAR, CHAR, CHARACTER, STRING, TEXT

Cadeia de caracteres

INT, INTEGER, BIGINT, SMALLINT

Número

Este é o mapeamento padrão. Use o parâmetro de sessão JS_TREAT_INTEGER_AS_BIGINT para mapear para Bigint JavaScript.

NUMBER(precisão, escala), DECIMAL(p, s), NUMERIC(p, s) onde scale = 0

Número

Este é o mapeamento padrão. Use o parâmetro de sessão JS_TREAT_INTEGER_AS_BIGINT para mapear para Bigint JavaScript.

NUMBER(precisão, escala), DECIMAL(p, s), NUMERIC(p, s) onde scale > 0

Número

FLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REAL

Número

TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ

Data

Valores TIMESTAMP_NTZ são retornados em UTC.

DATE

Data

TIME

Cadeia de caracteres

O tipo de dados TIME em SQL não tem equivalente em JavaScript, portanto é mapeado para uma cadeia de caracteres JavaScript.

BOOLEAN

Booleano

VARIANT, ARRAY, OBJECT

JSON

Busca de tipos de dados inteiros como Bigint

Por padrão, colunas INTEGER do Snowflake (incluindo BIGINT, NUMBER(p, 0), etc.) são convertidas para o tipo de dados Número do JavaScript. No entanto, os maiores valores inteiros legais do Snowflake são maiores do que os maiores valores numéricos legais JavaScript. Para converter as colunas INTEGER do Snowflake em Bigint JavaScript, que pode armazenar valores maiores que Número JavaScript, defina o parâmetro de sessão JS_TREAT_INTEGER_AS_BIGINT.

Há duas maneiras de definir este parâmetro:

  • Use a instrução ALTER SESSION, como mostrado abaixo:

    connection.execute( {
                        sqlText: 'ALTER SESSION SET JS_TREAT_INTEGER_AS_BIGINT = TRUE',
                        complete: function ...
                        }
                      );
    
    Copy
  • Especifique o parâmetro nas informações de configuração da conexão:

    var connection = snowflake.createConnection(
          {
          username: 'fakeusername',
          password: 'fakepassword',
          account: 'fakeaccountidentifier',
          jsTreatIntegerAsBigInt: true
          }
        );
    
    Copy

Busca de tipos de dados inteiros como cadeias de caracteres

Quando connection.execute() é chamado, a opção fetchAsString pode ser definida para forçar todos os números ou datas a serem retornados como cadeias de caracteres. Isto pode ser usado para obter:

  • Versões formatadas de valores do tipo DATE e TIMESTAMP (ou suas variantes).

  • Versões de cadeia de caracteres de tipos SQL numéricos que não podem ser convertidas em números JavaScript sem perda de precisão.

Por exemplo:

connection.execute({
  sqlText: 'SELECT 1.123456789123456789123456789 as "c1"',
  fetchAsString: ['Number'],
  complete: function(err, stmt, rows) {
    if (err) {
      console.error('Failed to execute statement due to the following error: ' + err.message);
    } else {
      console.log('c1: ' + rows[0].c1); // c1: 1.123456789123456789123456789
    }
  }
});
Copy