Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara memasukkan banyak catatan ke dalam Oracle DB menggunakan Node.js

Pembaruan 2019/04/25:

Driver, sejak versi 2.2, memiliki dukungan bawaan untuk eksekusi SQL batch. Gunakan connection.executeMany() untuk ini bila memungkinkan. Ini menawarkan semua manfaat kinerja dengan lebih sedikit kompleksitas. Lihat bagian Batch Statement Execute dari dokumentasi untuk detail selengkapnya:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Jawaban sebelumnya:

Saat ini, driver hanya mendukung ikatan array dengan PL/SQL, bukan SQL langsung. Kami berharap untuk meningkatkan ini di masa depan. Untuk saat ini, Anda dapat melakukan hal berikut...

Diberikan tabel ini:

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

Berikut ini akan berfungsi:

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

Itu akan memasukkan 500 baris dengan satu perjalanan pulang pergi ke database. Plus, satu konteks beralih antara mesin SQL dan PL/SQL di DB.

Seperti yang Anda lihat, array harus diikat secara terpisah (Anda tidak dapat mengikat array objek). Itu sebabnya contoh menunjukkan bagaimana memecahnya menjadi array terpisah untuk tujuan mengikat. Ini semua akan menjadi lebih elegan dari waktu ke waktu, tetapi ini berfungsi untuk saat ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memecahkan masalah Oracle - proses yang macet

  2. ORA-01000:kursor terbuka maksimum terlampaui saat menggunakan Spring SimpleJDBCCall

  3. Oracle 11g - Tanpa Pivot

  4. Oracle Floats vs Number

  5. Fungsi Oracle PLSQL memanggil fungsi kedua