Oracle
 sql >> Database >  >> RDS >> Oracle

Come inserire più record in Oracle DB utilizzando Node.js

Aggiornamento 25/04/2019:

Il driver, dalla versione 2.2, ha il supporto integrato per l'esecuzione batch SQL. Usa connection.executeMany() per questo quando possibile. Offre tutti i vantaggi in termini di prestazioni con una minore complessità. Per maggiori dettagli, vedere la sezione Batch Statement Execute della documentazione:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Risposta precedente:

Attualmente, il driver supporta solo i binding di array con PL/SQL, non SQL diretto. Speriamo di migliorare questo aspetto in futuro. Per ora, puoi fare quanto segue...

Data questa tabella:

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

Dovrebbe funzionare quanto segue:

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.');
    }
  );
});

Ciò inserirà 500 righe con un singolo roundtrip nel database. Inoltre, un unico cambio di contesto tra i motori SQL e PL/SQL nel DB.

Come puoi vedere, gli array devono essere associati separatamente (non puoi associare un array di oggetti). Ecco perché l'esempio mostra come suddividerli in matrici separate per scopi di associazione. Tutto questo dovrebbe diventare più elegante nel tempo, ma per ora funziona.