想來也是好搞笑,,自己以前一直用的都是mysql和postgre數據庫,很久沒用oracle數據庫了,最近項目有個定時任務,批量更新插入數據,然後我自己寫還是通過mysql的方式,也就是下面的第一種寫法往oracle數據庫裏面批量插入數據,測試的時候控制檯一直在報錯,
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正確結束
另一種還是什麼非法的字符什麼的,反正就是各種錯誤,弄得我都有些懷疑人生了,我記得以前明明就是這麼寫,怎麼現在就報錯了,,哇,足足坑了我一個下午+一個晚上,當時自己去網上找解決方案,其實也看到oracle也就下面的oracle數據庫插入方式,但是自己印象中用過的沒有這個鏈接union all什麼的,於是就一直沒有嘗試這種方式,一直還是按照這mysql的改來改去,最後是在是找不出來原因了,,,就嘗試了下oracle的方式,結果居然就插入成功了,,,哇我真的是心態崩了。。。。。一瞬間懷疑人生啊.........
中間還有一個小插曲,,因爲項目中用的是mybatis-plus這個框架,,我原先還以爲是這個框架不支持oracle批量插入,後面自寫了個小demo項目用mybatis框架自己測試了一下,結果還是一樣錯誤,,,知道後面改成了oracle方式才插入成功。。我真的是醉了.....
Oracle數據庫
<insert id="insertList">
insert into tableName(column1 , column2 , column3)
select t.* from(
<foreach collection="list" item="obj" index="index" sperator="union all" useGeneratedKeys="false">
(
select
#{obj.field} column1 ,
#{obj.field} column2,
#{obj.field} column3
from dual
)
</foreach>
)t
</insert>
mysql
第一種:
<insert id="insertByForeachTag" parameterType="java.util.List">
INSERT INTO Products(prod_id,vend_id,prod_name,prod_desc,prod_price)
VALUES
<foreach collection="prods" item="prod" separator=",">
(#{prod.prodId},#{prod.vendId},#{prod.prodName},#{prod.prodDesc},#{prod.prodPrice})
</foreach>
</insert>
第二種
<insert id="insertByForeachTag" parameterType="java.util.List">
<foreach collection="prods" item="prod" separator=";">
INSERT INTO
Products(prod_id,vend_id,prod_name,prod_desc,prod_price)
VALUES
(#{prod.prodId},#{prod.vendId},#{prod.prodName},#{prod.prodDesc},#{prod.prodPrice})
</foreach>
</insert>