最近在项目中需要使用oracle+mybatis批量插入数据,因为自增主键,遇到问题,现记录如下:
一、常用的两种sql写法报错
1、insert … values …
<insert id="batchInsert1" parameterType="java.util.List" useGeneratedKeys="false">
insert all
<foreach collection="list" item="item" index="index">
into TableName(id, name) values(TableName_sequence.nextval, #{item.name})
</foreach>
<!-- 必须加下面的查询 -->
SELECT 1 FROM DUAL
</insert>
报错结果:java.sql.SQLException: ORA-00001: 违反唯一约束条件…
2、insert … select …
<insert id="batchInsert2" parameterType="java.util.List" useGeneratedKeys="false">
insert into TableName(id, name)
<foreach collection="list" item="item" separator="union all">
select tableName_sequence.nextval, #{item.name} from dual
</foreach>
</insert>
报错结果:java.sql.SQLException: ORA-02287: 此处不允许序号
二、解决办法:
1、使用函数包装序列
create or replace function table_getSeq return number is
Result number;
begin
select TableName_sequence.nextval into Result from dual;
return(Result);
end table_getSeq ;
将两种sql中的“tableName_sequence.nextval”替换为函数名“table_getSeq”
2、使用触发器
create or replace trigger table_insert
before insert on tableName
for each row
begin
select TableName_sequence.nextval into :new.id from dual;
end;
将两种sql中关于id的字段去掉即可