sql >> Database >  >> RDS >> Oracle

Meerdere records invoegen in Oracle DB met Node.js

Update 2019/04/25:

De driver heeft sinds versie 2.2 ingebouwde ondersteuning voor batch SQL-uitvoering. Gebruik connection.executeMany() hiervoor indien mogelijk. Het biedt alle prestatievoordelen met minder complexiteit. Zie het gedeelte Batch Statement Uitvoeren van de documentatie voor meer details:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Vorig antwoord:

Momenteel ondersteunt het stuurprogramma alleen matrixbindingen met PL/SQL, geen directe SQL. We hopen dit in de toekomst te verbeteren. Voor nu kun je het volgende doen...

Gezien deze tabel:

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

Het volgende zou moeten werken:

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

Dat zal 500 rijen invoegen met een enkele retour naar de database. Plus een enkele contextwisseling tussen de SQL- en PL/SQL-engines in de DB.

Zoals u kunt zien, moeten de arrays afzonderlijk worden ingebonden (u kunt geen array met objecten binden). Daarom laat het voorbeeld zien hoe je ze kunt opsplitsen in afzonderlijke arrays voor bindingsdoeleinden. Dit zou in de loop van de tijd allemaal eleganter moeten worden, maar dit werkt voor nu.



  1. Een oplopende waarde opnemen in deze sql

  2. postgresql - krijg telling op waardebereiken

  3. Wat gebeurt er als ik een MySQL-kolom laat vallen zonder eerst de index te laten vallen?

  4. Tel verschillend per fiscaal jaar en toon alle datums in het zoekresultaat