Pembaruan 2019/04/25:
Driver, sejak versi 2.2, memiliki dukungan bawaan untuk eksekusi SQL batch. Gunakan connection.executeMany()
untuk ini bila memungkinkan. Ini menawarkan semua manfaat kinerja dengan lebih sedikit kompleksitas. Lihat bagian Batch Statement Execute dari dokumentasi untuk detail selengkapnya:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution
Jawaban sebelumnya:
Saat ini, driver hanya mendukung ikatan array dengan PL/SQL, bukan SQL langsung. Kami berharap untuk meningkatkan ini di masa depan. Untuk saat ini, Anda dapat melakukan hal berikut...
Diberikan tabel ini:
create table things (
id number not null,
name varchar2(50) not null
)
/
Berikut ini akan berfungsi:
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.');
}
);
});
Itu akan memasukkan 500 baris dengan satu perjalanan pulang pergi ke database. Plus, satu konteks beralih antara mesin SQL dan PL/SQL di DB.
Seperti yang Anda lihat, array harus diikat secara terpisah (Anda tidak dapat mengikat array objek). Itu sebabnya contoh menunjukkan bagaimana memecahnya menjadi array terpisah untuk tujuan mengikat. Ini semua akan menjadi lebih elegan dari waktu ke waktu, tetapi ini berfungsi untuk saat ini.