我有一个在浏览器中运行并与 REST 服务通信的应用程序。其余服务必须将数据写入 Oracle DB 假设它必须编写如下所示的实体:
var entity = {
"id": 0,
"date": new Date(),
"comment": 'test'
};
我有一个声明,如下所示:
ar statement = 'INSERT INTO MY_TABLE ( '
+ ' THE_ID '
+ ' , THE_DATE '
+ ' , THE_COMMENT '
+ ' ) VALUES ( '
+ ' :id, '
+ " :date, "
+ ' :comment'
+ ')';
实体数组称为:
var entities = [];
现在假设我有一个长度约为 30 的实体数组。我尝试了递归:
var i = 0;
// Function that Batch inserts an Array.
var insertArray = function (statement, entities, i, cb) {
if (i >= entities.length) {
console.log("exit insertArray.");
return cb(null, true);
}
insert(statement, entities[i], function (err, val) {
if (err) {
console.log('error insertArray: ', err);
return cb(err, null);
}
insertArray(statement, entities, ++i, cb);
});
};
这是将实体插入数据库的函数
var insert = function (statement, entity, cb) {
orawrap.execute(
statement,
{
"id": { val: entity.id, dir: oracledb.BIND_INOUT, type: oracledb.NUMBER },
"date": { val: entity.date, dir: oracledb.BIND_INOUT, type: oracledb.DATE },
"comment": { val: entity.comment, dir: oracledb.BIND_INOUT, type: oracledb.STRING }
},
cb);
};
此代码在大约 3 次递归调用后停止插入。 我也尝试过 for 循环。但由于在异步环境中使用回调更好,因此递归的想法对我来说似乎更好。无论如何,迭代方法也没有批量插入值。
你知道如何解决这个问题吗?
最佳答案
在 Node.js 中执行此类任务的最简单方法是使用异步库。查看异步库的 eachSeries
方法:
https://github.com/caolan/async#each
该链接指向 each
,但 eachSeries
只是 each
的变体,它按系列(一个接一个)运行事物,而不是比并行。您只需传递数组、应该为数组中的每个元素运行的函数以及迭代完成后要调用的另一个函数。
关于node.js - 将数组值批量插入数据库 Node.js、Oracle、orawrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270898/