Node.js 如何通过节点oracle db更新或插入数百万行?
我正在努力解决一个问题-如何使用节点oracle db驱动程序插入或更新数千行或数百万行的大量数据 关键是我可以在resultSet的帮助下选择大量数据。。。但接下来我必须对一行执行一些操作,然后更新或插入新行。这就是问题所在——我不知道如何尽快做到这一点 有人能帮我提个建议吗?谢谢Node.js 如何通过节点oracle db更新或插入数百万行?,node.js,oracle,sql-optimization,node-oracledb,Node.js,Oracle,Sql Optimization,Node Oracledb,我正在努力解决一个问题-如何使用节点oracle db驱动程序插入或更新数千行或数百万行的大量数据 关键是我可以在resultSet的帮助下选择大量数据。。。但接下来我必须对一行执行一些操作,然后更新或插入新行。这就是问题所在——我不知道如何尽快做到这一点 有人能帮我提个建议吗?谢谢 我可以向您保证,这些操作不能在db中完成 实际上,有很多不同的方法可以在需要时通过SQL和PL/SQL在DB中实现。人们通常希望使用他们熟悉的语言,在这种情况下可能是JavaScript,但是如果数据不必在层之间来
我可以向您保证,这些操作不能在db中完成 实际上,有很多不同的方法可以在需要时通过SQL和PL/SQL在DB中实现。人们通常希望使用他们熟悉的语言,在这种情况下可能是JavaScript,但是如果数据不必在层之间来回传输,性能会更好 这里有一个仅SQL的示例。。。诚然,这可以通过虚拟列实现,但它应该说明这一点 假设我们有以下表格: 创建表格 id号不为空, val1编号不为空, val2编号不为空, 约束内容\u pk主键id ; 将id、val1、val2值1、1、2插入到对象中; 将id、val1、val2值2、2、2插入到对象中; 将id、val1、val2值3、5、5插入到对象中; -将保存值1和值2的总和 创建一个表 东西的身份证号码, 总数 ; 改变表格内容 添加约束对象\u和\u fk1 外键对象 参考事物id; 现在,最简单、最高效的方法是通过SQL: 插入事物的总和 事情, 总和 选择id, val1+val2 从事物 我不在哪里 选择对象\u id 从事物的总和 ; 下面是另一个示例,它仅通过PL/SQL执行相同的操作,而PL/SQL可以提供更多的控制 开始 -循环的游标将大容量收集,以减少上下文之间的切换 -SQL和PL/SQL引擎是隐式的。 因为你知道 挑选* 从事物 我不在哪里 选择对象\u id 从事物的总和 环 -这个循环中的逻辑可能是无限复杂的。我正在插入值 -在循环中,但可以修改此逻辑以将数据存储在数组中 -然后插入循环后的所有其他批量操作。 插入事物的总和 事情, 总和 价值观 事物记录id, 物值1+物值2 ; 端环; 终止 可以从Node.js驱动程序调用其中任何一个。但是,假设您需要从驱动程序执行此操作,可能您正在接收数据库中尚未包含的数据。下面的示例演示如何从使用批量处理而不是逐行操作的驱动程序调用PL/SQL。由于往返行程减少,速度更快 我从我正在撰写的一篇博客文章中提取了这一点,因此表的定义有点不同: 创建表格 id号不为空, 名字是varchar250, 约束内容\u pk主键id ; 下面是JavaScript:
var oracledb = require('oracledb');
var async = require('async');
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;
}
things = getThings(500);
oracledb.getConnection(config, function(err, conn) {
var ids = [];
var names = [];
var start = Date.now();
if (err) {throw err;}
// We need to break up the array of JavaScript objects into arrays that
// work with node-oracledb bindings.
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.');
}
);
});
我希望这有帮助!: 需要对行执行哪些操作?一般来说,如果您可以在数据库中执行此操作,而不是将数百万行检索回客户端或应用程序服务器,那么您的情况会好得多……我可以向您保证,这些操作不能在db中执行。例如,有一种逻辑,从db中提取一行,进行一些计算,然后给我一个数字。我想把这个数字插入或更新到另一个表中。做一行,做一些计算,得到一个数字,这听起来正是数据库非常擅长的事情!好吧,也许这不是一个好例子。。。如何从一行中获取数据,在自定义转换器的帮助下对其进行解析,并最终获得一个xml文件?实际上,我不是db和sql方面的专家……用PL/sql可以做很多事情。如果这还不够好,那么就让Java在数据库中运行。它会更快,无论是10倍、100倍还是1000倍或更多,这取决于所涉及的处理过程,这非常好!我想这就是我要找的。非常感谢你!!!顺便说一句,你的博客文章正在进行中吗?或者我可以在互联网上找到它?那篇文章还没有发布,但是你可以访问这里的博客:@DanMcGhan的文章在