3

我在我的 nodeJs 应用程序中使用 node-oracledb 驱动程序。我必须进行批量插入(最多 6000 行),而simple-oracledb扩展的批量插入功能无法满足我的需求。6000 条记录的速度非常慢。然而,我从 node-oracledb 看到了这篇文章这篇文档,这似乎是一种很有前途的方式。只是我对 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 列绑定数组,因此我无法弄清楚它是如何为多列(整行)完成的。任何帮助将不胜感激!!!

4

3 回答 3

1
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");
});
于 2020-02-29T10:22:20.153 回答
0

我在这里谈了一点,但我真的需要更多的例子......

如果您将“INDEX BY BINARY_INTEGER”添加到您的 empidtype 类型,您的代码将起作用。这会将其从嵌套表更改为关联数组,这是驱动程序当前可以绑定的。

这是我回答的一个类似问题:How to insert multiple records into oracle db using node js

另一个演示如何批量执行此操作(第二个示例):Node.js + OracleDb - 多次插入最后一个日期

现在使用 async/await批处理会容易得多。

最后(我保证),您可能会发现这些幻灯片很有趣: https ://www.dropbox.com/s/69jt5uu1fqus84c/Tips%20and%20Tricks%20for%20Getting%20Started%20with%20the%20Oracle%20Database%20Driver%20for %20Node.pdf?dl=0

于 2017-10-26T23:32:46.850 回答
0

Node-oracledb 2.2 引入了connection.executeMany()(另见Batch Statement Execution),使批量数据插入更加高效。

于 2018-04-02T22:42:19.563 回答