我能够插入一条记录到表中,但我想在一次插入多条记录到表 -
我的代码是如下─
var doinsert_autocommit = function (conn, cb) {
var query="INSERT INTO test VALUES (:id,:name)";
var values=[{1,'rate'},{5,'ratee'}];
如果我使用[1,“鼠”] - 它的用于插入一排工作。
conn.execute(
"INSERT INTO test VALUES (:id,:name)",
values, // Bind values
{ autoCommit: true}, // Override the default non-autocommit behavior
function(err, result)
{
if (err) {
return cb(err, conn);
} else {
console.log("Rows inserted: " + result.rowsAffected); // 1
return cb(null, conn);
}
});
};
更新2019年4月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行有一个往返到数据库。 另外,在DB的SQL和PL / SQL引擎之间的单一上下文切换。
正如可以看到,所述阵列具有在分别被束缚(你不能结合对象的数组)。 这就是为什么示例演示了如何将它们分开成单独的阵列结合的目的。 这都应该随着时间的推移更优雅,但这个工程现在。
检出executeMany()
在节点OracleDB的2.2引入方法。 这种过度调用执行许多数据值一个语句,一般用显著的性能优势execute()
多次。
我用简单OracleDB的库批量插入,其延伸OracleDB的模块。
var async = require('async');
var oracledb = require('oracledb');
var dbConfig = require('./dbconfig.js');
var SimpleOracleDB = require('simple-oracledb');
SimpleOracleDB.extend(oracledb);
var doconnect = function(cb) {
oracledb.getConnection(
{
user : dbConfig.user,
password : dbConfig.password,
connectString : dbConfig.connectString
},
cb);
};
var dorelease = function(conn) {
conn.close(function (err) {
if (err)
console.error(err.message);
});
};
var doinsert_autocommit = function (conn, cb) {
conn.batchInsert(
"INSERT INTO test VALUES (:id,:name)",
[{id:1,name:'nayan'},{id:2,name:'chaan'},{id:3,name:'man'}], // Bind values
{ autoCommit: true}, // Override the default non-autocommit behavior
function(err, result)
{
if (err) {
return cb(err, conn);
} else {
console.log("Rows inserted: " + result.rowsAffected); // 1
return cb(null, conn);
}
});
};
async.waterfall(
[
doconnect,
doinsert_autocommit,
],
function (err, conn) {
if (err) { console.error("In waterfall error cb: ==>", err, "<=="); }
if (conn)
dorelease(conn);
});