在Oracle中,通过一个INSERT ALL语句批量插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Oracle中,通过一个INSERT ALL语句批量插入数据相关的知识,希望对你有一定的参考价值。

参考技术A Oracle:
INSERT ALL
INTO A(field_1,field_2) VALUES (value_1,value_2)
INTO A(field_1,field_2) VALUES (value_3,value_4)
INTO A(field_1,field_2) VALUES (value_5,value_6)
SELECT 1 FROM DUAL;

在Mybatis中使用
<insert id="insertData" parameterType="java.util.List"
useGeneratedKeys="false">
INSERT ALL
<foreach item="item" index="index" collection="list">
INTO T_GZL_BZ
(
ID,
JGH,
JGMC,
DW,
JGLX,
BZLB,
JGZWLB,
EDGZL,
ZGGZL,
BZ,
CJRBH,
CJRXM,
CJSJ,
SFSZ
) VALUES
(
#item.id,jdbcType=VARCHAR,
#item.teacherId,jdbcType=VARCHAR,
#item.teacherName,jdbcType=VARCHAR,
#item.departmentId,jdbcType=VARCHAR,
#item.teacherType,jdbcType=VARCHAR,
#item.compilationCategory,jdbcType=VARCHAR,
#item.jobCategory,jdbcType=VARCHAR,
#item.ratedWorkload,jdbcType=NUMERIC,
#item.maxWorkload,jdbcType=NUMERIC,
#item.remark,jdbcType=VARCHAR,
#item.creator,jdbcType=VARCHAR,
#item.creatorName,jdbcType=VARCHAR,
#item.createTime,jdbcType=DATE,
#item.settings,jdbcType=VARCHAR
)
</foreach>
SELECT 1 FROM DUAL
</insert>

mapper:
/**
* @param createList
* @return
*/
int insertData(@Param("list") List<WorkloadStandardDto> createList);

多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案

【中文标题】多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案【英文标题】:Multiple row insert: Best alternative for INSERT ALL statement working on Oracle 8i 【发布时间】:2015-12-20 11:52:48 【问题描述】:

下面显示的在 Oracle 8i 版本中可用的 INSERT ALL 语句的最佳和最推荐替代方案是什么?非常不幸的是,这个特定的语句在 8i 中不起作用,因为它的简单性和可读性。如果您能提供一些输入,那就太好了。谢谢。

插入所有语句

INSERT ALL
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;

此外,如果您的建议之一由于某些原因与下面显示的查询不同,那会更好。

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
      select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

非常感谢!

【问题讨论】:

为什么不简单地写三个insert 语句呢?如果包裹在事务中,那么复杂的 insert all 语法几乎没有任何区别,而且它也没有更多的类型。另外:你为什么使用一个已经失去支持超过十年的版本? 【参考方案1】:

如果您想将这些行作为一个事务插入,只需:

BEGIN 
  SAVEPOINT some_name;
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
EXCEPTION WHEN OTHERS THEN 
     ROLLBACK TO some_name;
     RAISE; -- reraise current error
END;
/

这模拟了INSERT ALL 的行为INSERT ALL 是单个命令,因此当发生某些错误时,此事务所做的所有更改都会回滚(请参阅语句级原子性 这里:http://docs.oracle.com/cd/E25054_01/server.1111/e25789/transact.htm)

【讨论】:

以上是关于在Oracle中,通过一个INSERT ALL语句批量插入数据的主要内容,如果未能解决你的问题,请参考以下文章

多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

Oracle insert all用法简介

oracle 导出超长Clob字段insert语句执行报字段过长的问题解决方案

Oracle基础之Merge into