ORA-00933错误报告:Mybatis批量插入时SQL命令未正确结束
最编程
2024-01-10 16:13:05
...
Mybatis 批量插入报ORA-00933: SQL 命令未正确结束
错误出现的场景是这样的,将多个月份的1000条数据分别插入到各月份表中。
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
上面语句,有博客中测试150万条数据182秒插入完成。本文的场景每次最多插入1000条,秒级肯定能完成,因为笔者场景是异步插入数据,对性能要求不高。
由此,改造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>
肯定有同学对语句中的$有疑问,有SQL注入风险。因此业务场景完全没有对外接口,可以放心使用。
我将1000条数据按照月份分成了多个Map作为插入参数,大致格式如下。
{
"table_name": "user_4",
"LIST": [
{
"id": "1",
"name": "bee"
},
{
"id": "2",
"name": "stack"
}
]
}
上一篇: datax抛出错误ORA-00933: SQL command not properly ended
下一篇: Oracle 批量插入数据时出现错误:ORA-00933: SQL 命令未正确结束 - 解决方案 for MyBatis
推荐阅读
-
oralce 使用foreach实现批量插入数据到数据库时,报错 ORA-00933: SQL 命令未正确结束
-
SQL命令未正确结束:Mybatis在oracle数据库中报错ORA-00933
-
如何解决mybatis批量插入数据到Oracle时遇到的ORA-00933: SQL 命令未正确结束问题
-
Oracle 批量插入数据时出现错误:ORA-00933: SQL 命令未正确结束 - 解决方案 for MyBatis
-
ORA-00933错误报告:Mybatis批量插入时SQL命令未正确结束
-
遇到ORA-00933错误:Mybatis无法正确结束SQL命令的批量插入操作
-
mybatis执行批量插入时,遇到了ORACLE ORA-00933错误:SQL命令未正确结束
-
Oracle数据库中使用MyBatis进行批量插入时出现java.sql.SQLException: ORA-00933: SQL命令未正确结束错误
-
Oracle中mybatis批量更新错误:ORA-00933:SQL命令未正确结束的解决方案
-
Mybatis --- ORA-00933: SQL 命令未正确结束