Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment insérer plusieurs enregistrements dans Oracle DB à l'aide de Node.js

Mise à jour 2019/04/25 :

Le pilote, depuis la version 2.2, a un support intégré pour l'exécution SQL par lots. Utilisez connection.executeMany() pour cela quand c'est possible. Il offre tous les avantages de performance avec moins de complexité. Consultez la section Batch Statement Execute de la documentation pour plus de détails :https ://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Réponse précédente :

Actuellement, le pilote ne prend en charge que les liaisons de tableaux avec PL/SQL, pas avec SQL direct. Nous espérons améliorer cela à l'avenir. Pour l'instant, vous pouvez faire ce qui suit...

Etant donné ce tableau :

create table things (
  id   number not null,
  name varchar2(50) not null
)
/

Ce qui suit devrait fonctionner :

var oracledb = require('oracledb');
var config = require('./dbconfig');
var things = [];
var idx;

function getThings(count) {
  var things = [];

  for (idx = 0; idx < count; idx += 1) {
    things[idx] = {
      id: idx,
      name: "Thing number " + idx
    };
  }

  return things;
}

// Imagine the 'things' were fetched via a REST call or from a file.
// We end up with an array of things we want to insert.
things = getThings(500);

oracledb.getConnection(config, function(err, conn) {
  var ids = [];
  var names = [];
  var start = Date.now();

  if (err) {throw err;}

  for (idx = 0; idx < things.length; idx += 1) {
    ids.push(things[idx].id);
    names.push(things[idx].name);
  }

  conn.execute(
    ` declare
        type number_aat is table of number
          index by pls_integer;
        type varchar2_aat is table of varchar2(50)
          index by pls_integer;

        l_ids   number_aat := :ids;
        l_names varchar2_aat := :names;
      begin
        forall x in l_ids.first .. l_ids.last
          insert into things (id, name) values (l_ids(x), l_names(x));
      end;`,
    {
      ids: {
        type: oracledb.NUMBER,
        dir: oracledb.BIND_IN,
        val: ids
      }, 
      names: {
        type: oracledb.STRING,
        dir: oracledb.BIND_IN,
        val: names
      }
    },
    {
      autoCommit: true
    },
    function(err) {
      if (err) {console.log(err); return;}

      console.log('Success. Inserted ' + things.length + ' rows in ' + (Date.now() - start) + ' ms.');
    }
  );
});

Cela insérera 500 lignes avec un seul aller-retour dans la base de données. De plus, un seul changement de contexte entre les moteurs SQL et PL/SQL dans la base de données.

Comme vous pouvez le voir, les tableaux doivent être liés séparément (vous ne pouvez pas lier un tableau d'objets). C'est pourquoi l'exemple montre comment les diviser en tableaux séparés à des fins de liaison. Tout cela devrait devenir plus élégant avec le temps, mais cela fonctionne pour le moment.