2019独角兽企业重金招聘Python工程师标准>>>

最近做一个批量导入的需求,将多条记录批量插入数据库中。解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入。期间遇到了“SQL 命令未正确结束 ”的错误,最终解决,记录下来供以后查阅和学习。

首先,在网上参考了有关Mybatis的foreach insert的资料,具体如下:

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

然后,照葫芦画瓢写了如下的xml文件,

xxxMapper.xml文件:

<insert id="addSupCity" parameterType="java.util.List"><selectKey keyProperty="cityId" order="BEFORE" resultType="String"><![CDATA[SELECT SEQ_OCL_SUPCITY.NEXTVAL FROM dual]]></selectKey>INSERT INTO T_OCL_SUPCITY(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)VALUES <foreach collection="list" item="item" index="index" separator=",">     (#{item.cityId,jdbcType=VARCHAR},#{item.cityCode,jdbcType=VARCHAR},#{item.cityName,jdbcType=VARCHAR},#{item.areaDesc,jdbcType=VARCHAR},#{item.supId,jdbcType=VARCHAR},#{item.stat,jdbcType=VARCHAR})</foreach>
</insert>

但是运行起来后就一直报错,报错信息如下:

### SQL: INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

把SQL复制出来在PL/SQL中运行也是报同样的错,如上也可以看出,使用批量插入执行的SQL语句等价于: INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?),而在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的 。再回过头去看那篇文章,发现这是适用于MySQL的,不适用于Oracle,因此把xml文件修改一下:

<insert id="addSupCity" parameterType="java.util.List">INSERT INTO T_OCL_SUPCITY(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
SELECT SEQ_OCL_SUPCITY.NEXTVAL CITY_ID, A.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">SELECT #{item.cityCode,jdbcType=VARCHAR} CITY_CODE,#{item.cityName,jdbcType=VARCHAR} CITY_NAME,#{item.areaDesc,jdbcType=VARCHAR} AREA_DESC,#{item.supId,jdbcType=VARCHAR} SUP_ID,#{item.stat,jdbcType=VARCHAR} STATFROM dual</foreach>)A</insert>

运行通过。在Oracle的版本中,有几点需要注意的:

1.SQL中没有VALUES;

2.<foreach>标签中的(selece ..... from dual);

3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。

转载于:https://my.oschina.net/greatqing/blog/737575

Mybatis结合Oracle的foreach insert批量插入报错!相关推荐

  1. MyBatis xml动态sql insert批量插入 报错Operand should contain 1 column(s)

    报错:运算至少需要包含一个列 原始写法 <insert id="insertComments" parameterType="Map">insert ...

  2. oracle批量插入报错,[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA

    [数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA 0 2020-08-19 08:00:06 Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-009 ...

  3. mysql 批量数据导入报错_Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA

    Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-00933: SQL 命令未正确结束 问题:用mybaits 批量插入数据到Oracle 数据库的时候, 报错:ORA-00933 ...

  4. Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除

    今天利用Mybatis的<for each>标签做oracle的批量插入数据时,发现和MySQL数据库有区别.在此记录下,以防之后再踩坑. 一.批量插入: 1.controller: /* ...

  5. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  6. oracle批量插入报错,MyBatis Oracle批量插入数据

    导语:在开发中或多或少都会遇到数据批量插入的功能,最近我在做项目的过程中就遇到了这样一个问题.上传Excel文件,解析文件内容并将解析的内容插入数据库. 思路分析 1.解析Excel文件 Excel文 ...

  7. Oracle model iterate,ibatis组合Oracle的iterate insert批量插入

    ibatis批量插入oracle数据库 INSERT INTO SYS_ROLE_MENU( ROLE_ID, MENU_ID ) SELECT A.* FROM ( SELECT #list[].k ...

  8. oracle匿名代码块执行insert,MyBatis+Oracle在执行insert时空值报错之从源码寻找解决办法...

    mybatis-oracle-config.xml 复制代码 1 <?xml version="1.0" encoding="UTF-8"?> 2 ...

  9. 批量插入报错:Parameter ‘id‘ not found. Available parameters are [forlonList, param1]

    项目场景: 在开发中,需要通过批量插入,生成主键id,然后进行数据关联操作 问题描述 Caused by: org.apache.ibatis.executor.ExecutorException: ...

最新文章

  1. struts2获取服务器临时目录
  2. 3.11 总结-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. 3 当某个应用的CPU使用达到100%,该怎么办?
  4. HandlerMappings
  5. 引起 Edge 浏览器远程代码漏洞的幕后黑手已出现!
  6. DSO missing from command line原因及解决办法
  7. mysql查询未讲课教师_经典教师 学生 成绩sql面试题再次来袭3(附答案)
  8. 主从复制之操作实践(二)
  9. java后台生成分页_Java实现分页的前台页面和后台代码
  10. 第4关国际标准书号校验python 头歌
  11. 网易微专业Android实战教程
  12. MATLAB小技巧(9) 图片合成视频与视频分帧
  13. 为什么在Python官网上下载这么慢?
  14. 关于ResNet50的解读
  15. SpringCloud(14) Sentinel 1.8.4 规则持久化到Nacos
  16. 出现错误(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker
  17. 车辆动力学知识总结(三) 二自由度动力学模型
  18. python多点找色找图_[按键精灵教程]带你了解多点找色、多点比色
  19. java 筛选文件后缀为.txt文件
  20. 【I2C】通用驱动i2c-dev分析

热门文章

  1. onvif协议_大华的录像机添加海康摄像头,使用了onvif协议,为啥也添加不进去?...
  2. 关于c语言的基本知识,第二章_关于C语言的基本知识.ppt
  3. java策略_java策略模式
  4. Django讲课笔记01:Django简介
  5. 19软件班专业英语学期总结
  6. 大学物理上册详细笔记_干货满满!快来pick自哈军工以来的学霸笔记!
  7. 我的 计算机朋友作文,电脑我的朋友作文
  8. java 编译 注释_Java编译、注释、常量简介
  9. java 动态编译_老生常谈Java动态编译(必看篇)
  10. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(1)