Cập nhật 2019/04/25:
Trình điều khiển, kể từ phiên bản 2.2, có hỗ trợ tích hợp để thực thi SQL hàng loạt. Sử dụng connection.executeMany()
cho điều này khi có thể. Nó cung cấp tất cả các lợi ích về hiệu suất mà ít phức tạp hơn. Xem phần Thực thi câu lệnh theo lô của tài liệu để biết thêm chi tiết: https://oracle.github.io/node-oracledb/doc/api.html#batchexecution
Câu trả lời trước:
Hiện tại, trình điều khiển chỉ hỗ trợ liên kết mảng với PL / SQL, không phải SQL trực tiếp. Chúng tôi hy vọng sẽ cải thiện điều này trong tương lai. Hiện tại, bạn có thể làm như sau ...
Cho bảng này:
create table things (
id number not null,
name varchar2(50) not null
)
/
Những điều sau sẽ hoạt động:
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.');
}
);
});
Điều đó sẽ chèn 500 hàng với một vòng tròn duy nhất vào cơ sở dữ liệu. Ngoài ra, một chuyển đổi ngữ cảnh duy nhất giữa các công cụ SQL và PL / SQL trong DB.
Như bạn có thể thấy, các mảng phải được liên kết riêng biệt (bạn không thể liên kết một mảng đối tượng). Đó là lý do tại sao ví dụ minh họa cách chia chúng thành các mảng riêng biệt cho các mục đích ràng buộc. Tất cả điều này sẽ trở nên thanh lịch hơn theo thời gian, nhưng điều này hiện có hiệu quả.