最近在項目中需要使用oracle+mybatis批量插入數據,因為自增主鍵,遇到問題,現記錄如下:
一、常用的兩種sql寫法報錯
1、insert ... values ...
1 <insert id="batchInsert1" parameterType="java.util.List" useGeneratedKeys="false"> 2 insert all 3 <foreach collection="list" item="item" index="index"> 4 into TableName(id, name) values(TableName_sequence.nextval, #{item.name}) 5 </foreach> 6 <!-- 必須加下面的查詢 --> 7 SELECT 1 FROM DUAL 8 </insert>
報錯結果:java.sql.SQLException: ORA-00001: 違反唯一約束條件...
2、insert ... select ...
1 <insert id="batchInsert2" parameterType="java.util.List" useGeneratedKeys="false"> 2 insert into TableName(id, name) 3 <foreach collection="list" item="item" separator="union all"> 4 select tableName_sequence.nextval, #{item.name} from dual 5 </foreach> 6 </insert>
報錯結果:java.sql.SQLException: ORA-02287: 此處不允許序號
二、解決辦法:
1、使用函數包裝序列
1 create or replace function table_getSeq return number is 2 Result number; 3 begin 4 select TableName_sequence.nextval into Result from dual; 5 return(Result); 6 end table_getSeq ;
將兩種sql中的“tableName_sequence.nextval”替換為函數名“table_getSeq”
2、使用觸發器
1 create or replace trigger table_insert 2 before insert on tableName 3 for each row 4 begin 5 select TableName_sequence.nextval into :new.id from dual; 6 end;
將兩種sql中關於id的字段去掉即可