我在nodeJs应用程序中使用node-oracledb驱动程序。我不得不进行批量插入(最多6000行),simple-oracledb扩展的批量插入功能无法满足我的需求。 6000条记录的速度非常缓慢。我从node-oracledb遇到了这个post和this doc,但它似乎是一种很有前途的方式。它只是PL / SQL的新手,我不明白如何做到这一点。
所以考虑我有下表:
CREATE TABLE MY_TABLE
( "CID" NUMBER,
"EMPID" VARCHAR2(10 BYTE));
我有3条批量插入记录。这是我的PL / SQL包:
CREATE OR REPLACE PACKAGE MY_PKG IS
TYPE cidtype IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE empidtype IS TABLE OF VARCHAR2(10);
PROCEDURE insertproc(cids IN cidtype, empids IN empidtype);
END;
/
CREATE OR REPLACE PACKAGE BODY MY_PKG IS
PROCEDURE insertproc(cids IN cidtype, empids IN empidtype) IS
BEGIN
FORALL i IN INDICES OF cids
INSERT INTO MY_TABLE (cid, empid) VALUES (cids(i), empids(i));
END;
END;
/
我的NodeJS代码:
var stmt = `BEGIN MY_PKG.insertproc(:cids, :empids); END;`;
var params = {
cids: {
type: oracledb.NUMBER,
dir: oracledb.BIND_IN,
val: [100, 101, 102]
},
empids: {
type: oracledb.STRING,
dir: oracledb.BIND_IN,
val: ['ab165634', 'df123456', 'cd456789']
}
};
connection.execute(stmt,params,function (err) { . . . });
然而,这会引发以下错误:
ORA-06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to 'INSERTPROC'\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored\n
由于该示例仅显示了如何为1列绑定数组,我无法弄清楚它是如何为多列(整行)完成的。任何帮助将不胜感激!!!
答案 0 :(得分:0)
我说了一点about this here,但我真的需要更多的例子......
如果您将“INDEX BY BINARY_INTEGER”添加到您的empidtype类型,您的代码将有效。这会将它从嵌套表更改为关联数组,这是驱动程序当前可以绑定到的数组。
以下是我回答的类似问题:How to insert multiple records into oracle db using node js
另一个演示如何批量执行此操作(第二个示例):Node.js + OracleDb - Insert the last date many times
现在批量处理会更容易with async/await。
最后(我保证),您可能会发现这些幻灯片很有趣: https://www.dropbox.com/s/69jt5uu1fqus84c/Tips%20and%20Tricks%20for%20Getting%20Started%20with%20the%20Oracle%20Database%20Driver%20for%20Node.pdf?dl=0
答案 1 :(得分:0)
Node-oracledb 2.2引入了connection.executeMany()(另见Batch Statement Execution),使批量数据插入更有效。
答案 2 :(得分:0)
var sql = "insert into employee(id,name) values (:1,:2)";
var content = [];
for(i=0;i<data.length.i++)
{
var temp = [];
temp.push(data[i].id);
temp.push(data[i].name);
content.push(temp);
}
connection.executeMany(sql,content,function(err,result)
{
if(err)
console.log(err);
else
console.log("Success");
});