sql >> Base de Datos >  >> RDS >> Oracle

Cómo insertar múltiples registros en Oracle DB usando Node.js

Actualización 2019/04/25:

El controlador, desde la versión 2.2, tiene soporte incorporado para la ejecución de SQL por lotes. Usa connection.executeMany() para esto cuando sea posible. Ofrece todos los beneficios de rendimiento con menos complejidad. Consulte la sección Ejecución de declaración por lotes de la documentación para obtener más detalles:https://oracle.github.io/node-oracledb/doc/api.html#ejecución por lotes

Respuesta anterior:

Actualmente, el controlador solo admite enlaces de matrices con PL/SQL, no con SQL directo. Esperamos mejorar esto en el futuro. Por ahora, puedes hacer lo siguiente...

Dada esta tabla:

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

Lo siguiente debería 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.');
    }
  );
});

Eso insertará 500 filas con un solo viaje de ida y vuelta a la base de datos. Además, un solo cambio de contexto entre los motores SQL y PL/SQL en la base de datos.

Como puede ver, las matrices deben vincularse por separado (no puede vincular una matriz de objetos). Es por eso que el ejemplo demuestra cómo dividirlos en matrices separadas con fines vinculantes. Todo esto debería volverse más elegante con el tiempo, pero funciona por ahora.