2017-08-08 59 views
1

我能夠插入一條記錄到表中,但我想一次多條記錄插入到表 -如何使用插入多條記錄到Oracle數據庫節點JS

我的代碼是如下─

var doinsert_autocommit = function (conn, cb) { 
var query="INSERT INTO test VALUES (:id,:name)"; 
var values=[{1,'rate'},{5,'ratee'}]; 

如果我使用[1,'老鼠'] - 它的工作爲 插入一行。

conn.execute(

"INSERT INTO test VALUES (:id,:name)", 
values, // Bind values 
{ autoCommit: true}, // Override the default non-autocommit behavior 
function(err, result) 
{ 
    if (err) { 
    return cb(err, conn); 
    } else { 
    console.log("Rows inserted: " + result.rowsAffected); // 1 
    return cb(null, conn); 
    } 
}); 

};

回答

0

我使用了simple-oracledb庫進行批量插入,它擴展了oracledb模塊。

var async = require('async'); 
var oracledb = require('oracledb'); 
var dbConfig = require('./dbconfig.js'); 
var SimpleOracleDB = require('simple-oracledb'); 

SimpleOracleDB.extend(oracledb); 
var doconnect = function(cb) { 
oracledb.getConnection(
{ 
    user   : dbConfig.user, 
    password  : dbConfig.password, 
    connectString : dbConfig.connectString 
}, 
cb); 
}; 

var dorelease = function(conn) { 
conn.close(function (err) { 
if (err) 
    console.error(err.message); 
}); 
}; 
var doinsert_autocommit = function (conn, cb) { 

conn.batchInsert(
"INSERT INTO test VALUES (:id,:name)", 
[{id:1,name:'nayan'},{id:2,name:'chaan'},{id:3,name:'man'}], // Bind values 
{ autoCommit: true}, // Override the default non-autocommit behavior 
function(err, result) 
{ 
    if (err) { 
    return cb(err, conn); 
    } else { 
    console.log("Rows inserted: " + result.rowsAffected); // 1 
    return cb(null, conn); 
    } 
}); 
}; 


async.waterfall(
[ 
doconnect, 
doinsert_autocommit, 

], 
function (err, conn) { 
if (err) { console.error("In waterfall error cb: ==>", err, "<=="); } 
if (conn) 
    dorelease(conn); 
}); 
+0

請注意,雖然方法名稱是batchInsert,但操作實際上是通過單獨的往返進行的。如果表現很重要,請參閱我對這個問題的回答。 –

1

當前,該驅動程序僅支持與PL/SQL進行數組綁定,而不是直接SQL。我們希望在未來改善這一點。現在,你可以做以下...

對於這個表:

create table things (
    id number not null, 
    name varchar2(50) not null 
) 
/

下面應該工作:

var oracledb = require('oracledb'); 
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; 
} 

// Imagine the 'things' were fetched via a REST call or from a file. 
// We end up with an array of things we want to insert. 
things = getThings(500); 

oracledb.getConnection(config, function(err, conn) { 
    var ids = []; 
    var names = []; 
    var start = Date.now(); 

    if (err) {throw err;} 

    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.'); 
    } 
); 
}); 

能加入500行有一個往返到數據庫。另外,數據庫中的SQL和PL/SQL引擎之間的單個上下文切換。你可以看到,數組必須單獨綁定(你不能綁定一個對象數組)。這就是爲什麼該示例演示如何將它們拆分爲單獨的數組以供綁定的目的。隨着時間的推移,這應該會變得更加優雅,但是現在這種方式仍然有效

相關問題