2017-08-08 11 views
1

私はテーブルに1つのレコードを挿入することが、私は卓上に一度に複数のレコードを挿入したいノードJS

マイコードはbelow-ある

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

私が[1、 'rat']を使用している場合 - の行を挿入しています。

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

私はバッチインサートのためのシンプルオーラドライブラリーを使用しました。オーラカードモジュールを拡張しました。

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

現在のところ、ドライバは、直接SQLではなくPL/SQLでの配列バインドのみをサポートしています。私たちはこれを将来的に改善したいと考えています。データベースへの単一の往復で500行を挿入します

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

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

次は動作するはずです:今のところ、次のような...

この表を考えるを行うことができます。さらに、DB内のSQLエンジンとPL/SQLエンジン間の単一のコンテキスト・スイッチ。

ご覧のとおり、配列は別々にバインドする必要があります(オブジェクトの配列をバインドすることはできません)。そのため、この例では、バインディングの目的で別々の配列に分割する方法を示しています。これは時間の経過とともにすべてがよりエレガントになるはずですが、これは今のところうまくいきます。