Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách chèn nhiều bản ghi vào Oracle DB bằng Node.js

Cập nhật 2019/04/25:

Trình điều khiển, kể từ phiên bản 2.2, có hỗ trợ tích hợp để thực thi SQL hàng loạt. Sử dụng connection.executeMany() cho điều này khi có thể. Nó cung cấp tất cả các lợi ích về hiệu suất mà ít phức tạp hơn. Xem phần Thực thi câu lệnh theo lô của tài liệu để biết thêm chi tiết: https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

Câu trả lời trước:

Hiện tại, trình điều khiển chỉ hỗ trợ liên kết mảng với PL / SQL, không phải SQL trực tiếp. Chúng tôi hy vọng sẽ cải thiện điều này trong tương lai. Hiện tại, bạn có thể làm như sau ...

Cho bảng này:

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

Những điều sau sẽ hoạt động:

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

Điều đó sẽ chèn 500 hàng với một vòng tròn duy nhất vào cơ sở dữ liệu. Ngoài ra, một chuyển đổi ngữ cảnh duy nhất giữa các công cụ SQL và PL / SQL trong DB.

Như bạn có thể thấy, các mảng phải được liên kết riêng biệt (bạn không thể liên kết một mảng đối tượng). Đó là lý do tại sao ví dụ minh họa cách chia chúng thành các mảng riêng biệt cho các mục đích ràng buộc. Tất cả điều này sẽ trở nên thanh lịch hơn theo thời gian, nhưng điều này hiện có hiệu quả.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu trữ Blob từ Java sang BD:Kích thước dữ liệu lớn hơn kích thước tối đa cho loại này khi rõ ràng là không

  2. node.js oracledb Không Chèn cũng không Cập nhật

  3. Oracle - lấy tên bảng từ văn bản sql

  4. Cách phân tích cú pháp dữ liệu bên trong CDATA trong oracle

  5. Hàm SYS_GUID () trong Oracle