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

Sådan indsætter du flere poster i Oracle DB ved hjælp af Node.js

Opdatering 2019/04/25:

Driveren har siden version 2.2 indbygget understøttelse af batch SQL-udførelse. Brug connection.executeMany() til dette, når det er muligt. Det tilbyder alle ydeevnefordele med mindre kompleksitet. Se afsnittet Udfør batcherklæring i dokumentationen for flere detaljer:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Forrige svar:

I øjeblikket understøtter driveren kun array-bindinger med PL/SQL, ikke direkte SQL. Vi håber at forbedre dette i fremtiden. Indtil videre kan du gøre følgende...

Givet denne tabel:

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

Følgende burde virke:

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

Det vil indsætte 500 rækker med en enkelt rundrejse til databasen. Plus, et enkelt kontekstskift mellem SQL- og PL/SQL-motorerne i DB.

Som du kan se, skal arrays bindes separat (du kan ikke binde en række objekter). Det er derfor, eksemplet viser, hvordan man deler dem op i separate arrays til bindingsformål. Det hele burde blive mere elegant med tiden, men det virker indtil videre.



  1. Kan ikke fylde pool (ingen bufferplads tilgængelig)

  2. Valg af en kolonne, der også er et nøgleord i MySQL

  3. Hvordan beregner man en kolonneværdi i oracle 10g?

  4. MIN() Funktion i PostgreSQL