sql >> Databáze >  >> RDS >> Oracle

Jak vložit více záznamů do Oracle DB pomocí Node.js

Aktualizace 25. 4. 2019:

Ovladač má od verze 2.2 vestavěnou podporu pro dávkové spouštění SQL. Použijte connection.executeMany() za to, když je to možné. Nabízí všechny výhody výkonu s menší složitostí. Další podrobnosti najdete v dokumentaci k části Batch Statement Execute:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Předchozí odpověď:

V současné době ovladač podporuje pouze vazby polí s PL/SQL, nikoli přímé SQL. Doufáme, že to v budoucnu zlepšíme. Prozatím můžete provést následující...

Vzhledem k této tabulce:

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

Mělo by fungovat následující:

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

To vloží 500 řádků s jednou zpáteční cestou do databáze. Navíc jeden kontextový přepínač mezi SQL a PL/SQL enginem v DB.

Jak vidíte, pole musí být svázána samostatně (nemůžete svázat pole objektů). To je důvod, proč příklad ukazuje, jak je rozdělit do samostatných polí pro účely vazby. To vše by mělo být časem elegantnější, ale zatím to funguje.



  1. Zvyšte hodnotu ID tabulky pro každý INSERT

  2. Využití MySQL DATE_ADD, 5denní interval

  3. Chcete přesto vytvořit spouštěč SQL Server DDL pro příkazy SELECT?

  4. Jak v oracle změním svou relaci tak, aby zobrazovala UTF8?