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.