Актуализация 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.
Както можете да видите, масивите трябва да бъдат обвързани отделно (не можете да обвържете масив от обекти). Ето защо примерът демонстрира как да ги разделите на отделни масиви за целите на обвързването. Всичко това трябва да стане по-елегантно с времето, но засега работи.