node.js
  • oracle
  • recursion
  • 2015-12-14 90 views 2 likes 
    2

    我有一個應用程序在瀏覽器中運行並與REST服務通信。可以REST服務具有將數據寫入到Oracle數據庫讓說必須寫一個實體是這樣的:將數組值插入數據庫Node.js,Oracle,orawrap

    var entity = { 
        "id": 0, 
        "date": new Date(), 
        "comment": 'test' 
    }; 
    

    而且我有一個聲明,看起來像這樣:

    ar statement = 'INSERT INTO MY_TABLE (' 
         + ' THE_ID ' 
         + ' , THE_DATE ' 
         + ' , THE_COMMENT ' 
         + ') VALUES (' 
         + ' :id, ' 
         + " :date, " 
         + ' :comment' 
         + ')'; 
    

    數組實體被稱爲:

    var entities = []; 
    

    現在可以說我有實體的陣列的30左右的長度我試圖遞歸:

    var i = 0; 
    // Function that Batch inserts an Array. 
    var insertArray = function (statement, entities, i, cb) { 
        if (i >= entities.length) { 
         console.log("exit insertArray."); 
         return cb(null, true); 
        } 
    
        insert(statement, entities[i], function (err, val) { 
         if (err) { 
          console.log('error insertArray: ', err); 
          return cb(err, null); 
         } 
    
         insertArray(statement, entities, ++i, cb); 
        }); 
    }; 
    

    這是插入一個實體到DB

    var insert = function (statement, entity, cb) { 
        orawrap.execute(
         statement, 
         { 
          "id": { val: entity.id, dir: oracledb.BIND_INOUT, type: oracledb.NUMBER }, 
          "date": { val: entity.date, dir: oracledb.BIND_INOUT, type: oracledb.DATE }, 
          "comment": { val: entity.comment, dir: oracledb.BIND_INOUT, type: oracledb.STRING } 
         }, 
         cb); 
    }; 
    

    該代碼後約3遞歸調用停止插入功能。 我也在for循環中嘗試過。但由於它更適合在異步環境中使用回調,遞歸的想法對我來說似乎更好。無論如何,迭代方法並沒有批量插入值。

    你知道如何解決這個問題嗎?

    回答

    2

    在Node.js中完成這些類型任務的最簡單方法是使用異步庫。結帳異步庫的eachSeries方法: https://github.com/caolan/async#each

    這鏈接指向each,但eachSeries只是在each的變化,運行在一系列的東西(一個接一個),而不是並行。您只需傳遞數組,應該爲數組中的每個元素運行的函數,以及在迭代完成時調用另一個函數。

    相關問題