首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node-oracledb -使用关联数组的批量插入

node-oracledb -使用关联数组的批量插入
EN

Stack Overflow用户
提问于 2017-10-27 06:34:24
回答 3查看 1.8K关注 0票数 3

我在nodeJs应用程序中使用node-oracledb驱动程序。我不得不进行批量插入(最多6000行),而simple-oracledb扩展的批插入功能不能满足我的需求。对于6000条记录来说,它的速度慢得令人痛苦。但是,我在node-oracledb中遇到了这个postthis doc,它似乎是一种很有前途的方法。只是我是PL/SQL的新手,我不知道该怎么做。

因此,考虑一下我的下表:

代码语言:javascript
复制
CREATE TABLE MY_TABLE 
( "CID" NUMBER,
"EMPID" VARCHAR2(10 BYTE));

我有3条记录用于批量插入。下面是我的PL/SQL程序包:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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) { . . . });

但是,这会抛出以下错误:

代码语言:javascript
复制
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列的数组,我不知道如何绑定多列(整行)。任何帮助都将非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2020-02-29 18:22:20

代码语言:javascript
复制
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");
});
票数 1
EN

Stack Overflow用户

发布于 2017-10-27 07:32:47

我说了一点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

票数 0
EN

Stack Overflow用户

发布于 2018-04-03 06:42:20

Node-oracledb2.2引入了connection.executeMany() (也可以参见Batch Statement Execution),使得批量数据插入更加高效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46964852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档