我在我的nodeJs应用程序中使用了node-oracledb驱动程序。我必须进行批量插入(最多6000行),并且simple-oracledb扩展名的批量插入功能无法满足我的需求。 6000条记录的速度非常慢。我从node-oracledb遇到了这个postthis 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


由于该示例仅显示了u如何绑定1列的数组,因此我无法弄清楚如何对多列(整个行)进行绑定。任何帮助将不胜感激!!!

最佳答案

我说了about this here,但实际上我需要更多示例...

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

我回答了一个类似的问题: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

10-04 11:22