Exploitation des résultats

Renvoi de résultats en ligne

La façon la plus répandue d’exploiter des résultats est d’effectuer un rappel complete à connection.execute(). Lorsque l’instruction est terminée et que le résultat est prêt à être exploité, le rappel complete est invoqué avec les lignes de résultat renvoyées en ligne :

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

Diffusion de résultats

Il est également possible d’exploiter un résultat sous forme de flux de lignes. Ceci peut être fait en utilisant la méthode statement.streamRows(). Ceci retourne un flux Node.js Readable qui peut être utilisé pour exploiter les lignes lorsqu’elles sont reçues. Pour plus d’informations sur le flux Readable , reportez-vous à la documentation Node.js.

Par exemple :

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

Traitement des résultats par lots

Par défaut, la méthode statement.streamRows() produit un flux qui inclut chaque ligne dans le résultat. Cependant, si vous voulez seulement exploiter un sous-ensemble du résultat, ou si vous voulez exploiter les lignes de résultat par lots, vous pouvez appeler streamRows() avec les arguments start et end. Lorsque ces options supplémentaires sont spécifiées, seules les lignes de la plage demandée sont diffusées :

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

Conversion de type de données

Lorsque les lignes de résultats sont produites, le pilote mappe automatiquement les types de données SQL à leurs équivalents JavaScript correspondants. Par exemple, les valeurs de type TIMESTAMP et DATE sont retournées sous la forme d’objets Date JavaScript.

Pour le mappage complet des types de données JavaScript à SQL , reportez-vous au tableau ci-dessous :

Type de données SQL

Type de données JavaScript

Remarques

VARCHAR, CHAR, CHARACTER, STRING, TEXT

Chaîne

INT, INTEGER, BIGINT, SMALLINT

Nombre

C’est le mappage par défaut. Utilisez le paramètre de session JS_TREAT_INTEGER_AS_BIGINT pour mapper à JavaScript Bigint.

NUMBER(précision, échelle), DECIMAL(p, s), NUMERIC(p, s) où scale = 0

Nombre

C’est le mappage par défaut. Utilisez le paramètre de session JS_TREAT_INTEGER_AS_BIGINT pour mapper à JavaScript Bigint.

NUMBER(précision, échelle), DECIMAL(p, s), NUMERIC(p, s) où scale > 0

Nombre

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

Nombre

TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ

Date

Les valeurs TIMESTAMP_NTZ sont renvoyées dans UTC.

DATE

Date

TIME

Chaîne

Notez que le type de données TIME dans SQL n’a pas d’équivalent dans JavaScript. Il est donc mappé à une chaîne JavaScript.

BOOLEAN

Booléen

VARIANT, ARRAY, OBJECT

JSON

Récupérer des types de données entiers en tant que Bigint

Par défaut, les colonnes INTEGER Snowflake (y compris BIGINT, NUMBER(p, 0), etc.) sont converties en type de données JavaScript Number. Toutefois, les plus grandes valeurs légales entières de Snowflake sont supérieures aux plus grandes valeurs légales JavaScript. Pour convertir les colonnes INTEGER Snowflake au format JavaScript Bigint, qui peut stocker des valeurs supérieures à JavaScript Number, définissez le paramètre de session JS_TREAT_INTEGER_AS_BIGINT.

Il y a deux façons de définir ce paramètre :

  • Utilisez l’instruction ALTER SESSION, comme indiqué ci-dessous :

    connection.execute( {
                        sqlText: 'ALTER SESSION SET JS_TREAT_INTEGER_AS_BIGINT = TRUE',
                        complete: function ...
                        }
                      );
    
    Copy
  • Spécifiez le paramètre dans les informations de configuration de la connexion :

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

Récupération des types de données sous forme de chaînes

Lorsque connection.execute() est appelé, l’option fetchAsString peut être définie pour forcer tous les nombres ou dates à être retournés sous forme de chaînes. Ceci peut être utilisé pour obtenir les éléments suivants :

  • Versions formatées des valeurs de type DATE et TIMESTAMP (ou ses variantes).

  • Versions de chaîne de types numériques SQL qui ne peuvent pas être converties en numéros JavaScript sans perte de précision.

Par exemple :

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