Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wstawić wiele rekordów do bazy danych Oracle za pomocą Node.js

Aktualizacja 2019/04/25:

Sterownik od wersji 2.2 posiada wbudowaną obsługę wykonywania wsadowego SQL. Użyj connection.executeMany() do tego, kiedy to możliwe. Oferuje wszystkie korzyści związane z wydajnością przy mniejszej złożoności. Więcej informacji można znaleźć w sekcji dokumentacji dotyczącej wykonywania instrukcji wsadowych:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Poprzednia odpowiedź:

Obecnie sterownik obsługuje tylko powiązania tablicy z PL/SQL, a nie bezpośredni SQL. Mamy nadzieję, że poprawimy to w przyszłości. Na razie możesz wykonać następujące czynności...

Biorąc pod uwagę tę tabelę:

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

Powinny działać:

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

Spowoduje to wstawienie 500 wierszy z pojedynczą podróżą w obie strony do bazy danych. Dodatkowo pojedynczy przełącznik kontekstu między silnikami SQL i PL/SQL w bazie danych.

Jak widać, tablice muszą być powiązane osobno (nie można powiązać tablicy obiektów). Dlatego przykład pokazuje, jak podzielić je na oddzielne tablice w celu powiązania. Z czasem wszystko powinno stać się bardziej eleganckie, ale na razie to działa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00936:brak wyroczni wyrażenia

  2. Nowe terminy bezpłatnych egzaminów certyfikacyjnych w Oracle Cloud i Autonomous Database

  3. Dlaczego nie mogę połączyć się przez jdbc za pomocą SQLcl

  4. Oracle PL/SQL:Sprawdź, czy BLOB lub CLOB jest pusty

  5. ORA-20001 w R12 Zbierz statystyki schematu dotyczące 11g (FND_HISTOGRAM_COLS)