Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да вмъкнете множество записи в Oracle DB с помощта на Node.js

Актуализация 2019/04/25:

Драйверът, от версия 2.2, има вградена поддръжка за пакетно изпълнение на SQL. Използвайте connection.executeMany() за това, когато е възможно. Той предлага всички предимства на производителността с по-малко сложност. Вижте секцията Изпълнение на пакетен оператор в документацията за повече подробности:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Предишен отговор:

Понастоящем драйверът поддържа само свързване на масиви с PL/SQL, а не директен SQL. Надяваме се да подобрим това в бъдеще. Засега можете да направите следното...

При тази таблица:

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

Следното трябва да работи:

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

Това ще вмъкне 500 реда с едно пътуване до базата данни. Освен това, едно превключване на контекста между SQL и PL/SQL машините в DB.

Както можете да видите, масивите трябва да бъдат обвързани отделно (не можете да обвържете масив от обекти). Ето защо примерът демонстрира как да ги разделите на отделни масиви за целите на обвързването. Всичко това трябва да стане по-елегантно с времето, но засега работи.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Допълнителна обработка на данните, върнати в даден dbms_output

  2. Не е валиден месец в Oracle, когато се използва add_months

  3. Обобщаване на множество таблици със стойности по подразбиране

  4. Oracle dbms_job.submit:Смесване на синхронно и асинхронно

  5. Как да използвате SYS_REFCURSUR в select for update в pl/sql