Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como inserir vários registros no Oracle DB usando Node.js


Atualização 25/04/2019:

O driver, desde a versão 2.2, possui suporte integrado para execução de SQL em lote. Use connection.executeMany() para isso quando possível. Ele oferece todos os benefícios de desempenho com menos complexidade. Consulte a seção Execução de instrução em lote da documentação para obter mais detalhes:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Resposta anterior:

Atualmente, o driver suporta apenas associações de matriz com PL/SQL, não com SQL direto. Esperamos melhorar isso no futuro. Por enquanto, você pode fazer o seguinte...

Dada esta tabela:
create table things (
  id   number not null,
  name varchar2(50) not null
)
/

O seguinte deve funcionar:
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.');
    }
  );
});

Isso inserirá 500 linhas com uma única viagem de ida e volta ao banco de dados. Além disso, uma única alternância de contexto entre os mecanismos SQL e PL/SQL no banco de dados.

Como você pode ver, os arrays precisam ser vinculados separadamente (você não pode vincular um array de objetos). É por isso que o exemplo demonstra como dividi-los em arrays separados para fins de vinculação. Isso tudo deve ficar mais elegante com o tempo, mas isso funciona por enquanto.