本来没打算提的,之前碰到过一次,解决了就没管了,结果这次是前面别人写的代码我看了好半天才反应过来是sql写法问题。
大家都知道mysql中批量insert操作是用多个括号用逗号隔开来实现的,如:
insert into tablename(a, b, c) values (#a#, #b#, #c#),(#a#, #b#, #c#),(#a#, #b#, #c#)
这样子的形式在oracle是不行的,直接会报错你的sql没有结束。
而mysql操作在ibatis中是这样写的,如下:
<insert id="insertXXX" parameterClass="java.util.List">
insert into tablename
(a,b,c)
values
<iterate conjunction="," >
(#codes[].a#,#codes[].b#,#codes[].c#)
</iterate>
</insert> oracle中是怎么样写的呢。
oracle中的方法是类似于表复制的办法:
insert into tablename(a, b, c) select #a#,#b#,#c# from dual
这是单句的形式,为什么不直接说批量的?因为单句知道了,批量是一样的,只是用union 将多条要insert的记录联合起来即可。
insert into tablename(a, b, c)
select code[].#a#,code[].#b#,code[].#c# from dual
union
select code[].#a#,code[].#b#,code[].#c# from dual
union
select code[].#a#,code[].#b#,code[].#c# from dual
最后,ibatis中批量insert到oracle的用法,如下:
<insert id="insertXXX" parameterClass="java.util.List">
insert into W_DEPOT
(a, b, c)
<iterate conjunction="UNION" >
SELECT #codes[].a#,#codes[].b#,#codes[].a# FROM DUAL
</iterate>
</insert>OK,搞定了,童鞋们不要再出错了哦。
本文对比了MySQL和Oracle数据库中批量插入数据的不同方法。MySQL使用逗号分隔的值列表,而在Oracle中则通过UNION连接多次从DUAL表选择的方式实现。文章还提供了在ibatis框架下两种数据库的具体实现代码。
1515

被折叠的 条评论
为什么被折叠?



