相关文章推荐
快乐的小熊猫  ·  Oracle数据库之PL/SQL异常处理_p ...·  1 月前    · 
飘逸的登山鞋  ·  Chapter 5: cAdvisor - ...·  4 月前    · 
谦和的猕猴桃  ·  openGL之glsl入门7下--添加鱼眼及 ...·  1 年前    · 
爱搭讪的芒果  ·  银河麒麟操作系统常用问题及解决方法_国产麒麟 ...·  2 年前    · 
博学的钢笔  ·  R统计绘图-corrplot绘制热图及颜色、 ...·  2 年前    · 
非常酷的红薯  ·  合创汽车Z03的缺点是什么?合创Z03续航虚 ...·  2 年前    · 
Code  ›  MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束开发者社区
list oracle mybatis oracle数据库
https://cloud.tencent.com/developer/article/2076242
闯红灯的八宝粥
2 年前
作者头像
星哥玩云
0 篇文章

MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 开源部署 > MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

作者头像
星哥玩云
发布 于 2022-08-18 16:36:21
1.4K 0
发布 于 2022-08-18 16:36:21
举报

最近在使用MyBatis操作 Oracle数据库 的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis

的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常

### Error updating database.  Cause: Java.sql.SQLSyntaxErrorException: ORA-00933 : SQL 命令未正确结束

错误的写法如下

<insert id="insertExpenseItem" parameterType="List" >     insert into expenseItem values     <foreach collection="list" item="item" separator="," >             seq_item.nextval,             #{item.expId},             #{item.type},             #{item.amount},             #{item.itemDesc}     </foreach> </insert>

捕捉到的SQL语句如下

- ==> Preparing: insert into expenseItem values ( seq_item.nextval, ?, ?, ?, ? ) , ( seq_item.nextval, ?, ?, ?, ? ) - ==> Parameters: 11(Integer), 1(String), 1111.0(Double), 2(String), 11(Integer), 3(String), 1111.0(Double), 2222(String)

即使在pl/sql上执行该语句依旧会报错!这样分析大概就是 Oracle 语法的问题了

首先在度娘上找了MyBatis 之foreach插入的相关资料

具体如下:

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

于是乎就有了上边不动脑,错误的写法了!!

又查了MyBatis操作 Oracle 的相关资料

得到结论:在 Oracle 的版本中,有几点需要注意的:

1.SQL中没有VALUES;

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

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

正确的写法如下:

<insert id="insertExpenseItem" parameterType="List">         insert into expenseItem(itemId,expId,type,amount,itemDesc)             select seq_item.nextval itemId,A.*         from(             <foreach collection="list" item="item" separator="union all" >                 select                     #{item.expId} expId,                     #{item.type} type,

 
推荐文章
快乐的小熊猫  ·  Oracle数据库之PL/SQL异常处理_pls-00703
1 月前
飘逸的登山鞋  ·  Chapter 5: cAdvisor - Kubernetes Guides - Apptio
4 月前
谦和的猕猴桃  ·  openGL之glsl入门7下--添加鱼眼及全景球面纹理_鱼眼图是什么格式的-CSDN博客
1 年前
爱搭讪的芒果  ·  银河麒麟操作系统常用问题及解决方法_国产麒麟系统没有声音_xianjie0318的博客-CSDN博客
2 年前
博学的钢笔  ·  R统计绘图-corrplot绘制热图及颜色、字体等细节修改1 - 知乎
2 年前
非常酷的红薯  ·  合创汽车Z03的缺点是什么?合创Z03续航虚不虚-无敌电动
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号