如何在oracle数据表中一次性插入多条记录?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在oracle数据表中一次性插入多条记录?相关的知识,希望对你有一定的参考价值。

看是什么样子的插入法。
如果是从其他的表导入那么用insert into+表名(字段)(字段入围全部可以不写)+as select+字段+from+数据来源表名 where+条件;(注意:前后字段顺序一致)
如果从外部表导入,那么就没什么问题sqllar导入。
如果是需要手动的输入,那么我建议就建立外部表,然后用sqllar去倒,可以每次输入都同时输入一张外部表,然后用sqllar导入,这样就可以了。
参考技术A 插入多条数据通过INSERT INTO ... VALUES ...这样肯定不行。
如果这多条数据是从一个表中提取出来的,可以使用INSERT INTO TABLE SELECT COLUMN(或者是定值) FROM TABLE ...这样的形式来实现多条的插入。
参考技术B insert into doc_data (code,id,value,state)

select '13','川A','成都市公安局交通警察支队车辆管理所',0 from dual

union all select '13','川B','绵阳市公安局交通警察支队车辆管理所',0 from dual

union all select '13','川C','自贡市公安局交通警察支队车辆管理所',0 from dual

union all select '13','川D','攀枝花市公安局交通警察支队车辆管理所',0 from dual

....
...
..
参考技术C 如果是从某一张表里筛选出来了,就用楼上的方法。
如果是单纯的插数据,就只能一条条的插,没有捷径的。
参考技术D insert into table select
(
'B',select typeid from table where userid ='A');

--------------------------
写成这样试试
另外,虚机团上产品团购,超级便宜

如何使用 Node.js 将多条记录插入 Oracle DB

【中文标题】如何使用 Node.js 将多条记录插入 Oracle DB【英文标题】:How to insert multiple records into Oracle DB using Node.js 【发布时间】:2018-01-16 01:42:30 【问题描述】:

我可以向表中插入一条记录,但我想一次向表中插入多条记录-

我的代码在下面-

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);
  
);

;

【问题讨论】:

【参考方案1】:

2019 年 4 月 25 日更新:

驱动程序,从 2.2 版开始,内置了对批处理 SQL 执行的支持。尽可能使用connection.executeMany()。它以较低的复杂性提供所有性能优势。有关详细信息,请参阅文档的批处理语句执行部分:https://oracle.github.io/node-oracledb/doc/api.html#batchexecution

上一个答案:

目前,驱动仅支持使用 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 引擎之间的单一上下文切换。

如您所见,数组必须单独绑定(不能绑定对象数组)。这就是为什么该示例演示了如何将它们分解为单独的数组以进行绑定。随着时间的推移,这一切都应该变得更加优雅,但现在可行。

【讨论】:

我很困惑executeMany,但你的代码包含conn.execute(【参考方案2】:

查看 node-oracledb 2.2 中引入的 executeMany() 方法。这将执行一条具有许多数据值的语句,通常比多次调用execute() 具有显着的性能优势。

例如:

const sql = `INSERT INTO mytab VALUES (:a, :b)`;

const binds = [
   a: 1, b: "One" ,
   a: 2, b: "Two" ,
   a: 3, b: "Three" 
];

const options = 
  autoCommit: true,
  bindDefs: 
    a:  type: oracledb.NUMBER ,
    b:  type: oracledb.STRING, maxSize: 5 
  
;

const result = await connection.executeMany(sql, binds, options);

console.log(result.rowsAffected);  // 3

请参阅 node-oracledb 文档Batch Statement Execution and Bulk Loading。

【讨论】:

【参考方案3】:

我使用 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);
 );

【讨论】:

请注意,虽然方法名称是batchInsert,但操作实际上是通过单独的往返来完成的。如果性能很重要,请参阅我对这个问题的回答。

以上是关于如何在oracle数据表中一次性插入多条记录?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle一次插入多条记录时,如何给定主键?

如何使用 Node.js 将多条记录插入 Oracle DB

insert一次插入多条数据

oracle Insert 一次插入多条记录

如何使用java代码向oracle数据库一次性插入多条数据

sql 一次插入多条记录