Mybatis 批量插入报ORA-00933: SQL 命令未正确结束

MySQL中,批量插入数据到表,会在一定程度提高效率。

insert into table (column1, column2)values(value1, value2), (value1, value2)

对于List<Map<String, Object>>类型的参数,使用mybatis实现上面语句需要用到动态SQL–foreach。

<insert id="batchInsert">
	insert into ${table_name} (
	id, name)
	values 
	<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
	  #{item.id, jdbcType=VARCHAR},
	  #{item.name, jdbcType=VARCHAR}
	</foreach>
</insert>

上面的语句对于MySQL执行起来没有问题,但对Oracle数据库则会报如题错误:SQL命令未正确结束。

可以用Oracle虚拟表来解决这个问题,首先将数据foreach作为一张虚拟表,然后全量插入到新表中。

INSERT INTO TEMP_20200210 (DMC)
    SELECT CD.* FROM
    (
        SELECT 1234567 FROM DUAL UNION
        SELECT 1234568 FROM DUAL UNION
        SELECT 1234568 FROM DUAL
    ) CD

由此,改造mybatis语句如下:

<insert id="batchInsert">
	insert into ${table_name} (
	id, name)
	SELECT A.* FROM (
	<foreach collection="list" item="item" index="index" separator="UNION ALL">
	  select
	  #{item.id, jdbcType=VARCHAR} id,
	  #{item.name, jdbcType=VARCHAR} name
	  FROM DUAL
	</foreach>
	) A
</insert>

 

posted @   残城碎梦  阅读(1711)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示