在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的区别