foreach mysql 报错_MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

news/2024/7/5 6:49:44 标签: foreach mysql 报错

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

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

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

错误的写法如下

insert into expenseItem values(

seq_item.nextval,

#{item.expId},

#{item.type},

#{item.amount},

#{item.itemDesc}

)

捕捉到的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.标签中的(selece ..... from dual);

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

正确的写法如下:

insert into expenseItem(itemId,expId,type,amount,itemDesc)

select seq_item.nextval itemId,A.*

from(select

#{item.expId} expId,

#{item.type} type,

#{item.amount} amount,

#{item.itemDesc} itemDesc

from dual)A

完美解决!

PS:

注意不能把序列写在foeach里面的select里面!!按照我的正确写法进行照葫芦画瓢即可

5bc17e6364e295378e6a4cea8282010d.png

原文:https://www.cnblogs.com/arebirth/p/javamybatisodb1.html


http://www.niftyadmin.cn/n/1670199.html

相关文章

《Windows服务器配置与管理》DNS服务器

工作任务描述公司名称是abc公司,搭建DNS服务器。总公司在北京,总公司的注册的域名为HT.com。你公司下属两个分支,第一个为亚洲公司(Asia),公司总部在北京,第二个为欧洲公司(Europe),请你在总公司上建立一台…

基于Apache CXF的Web Service服务端/客户端

转自:https://www.aliyun.com/zixun/wenji/1263190.html CXF服务端: [java] view plaincopy package com.sean.server; import javax.jws.WebParam; import javax.jws.WebService; WebService public interface Plus { public int add(WebP…

【 sql数据库 】把逗号分隔的字符串拆成临时表

方式一:通过charindex和substring。 create function func_splitstring(str nvarchar(max),split varchar(10))returns t Table (c1 varchar(100))asbegin declare i int declare s int set i1 set s1 while(i>0) begin set ichar…

计算机组成原理奉远侦,计算机组成原理所研究的内容是什么?

满意答案xzparc2015.10.16采纳率:46% 等级:12已帮助:6852人计算机组成原理是计算机应用和计算机软件专业以及其他相关专业必修的专业基础课,它主要讨论计算机各组成部件的基本概念、基本结构、工作原理及设计方法。教学实践证明…

Java 20年:JVM虚拟化技术的发展

虚拟化技术已经有了几十年的发展历史,并且在硬件、操作系统层面都已经得到了广泛的应用。虚拟化不但可以显著节省成本,而且还可以提升管理性。同样,虚拟化技术也可以应用在JVM中,以提高资源利用率,降低单应用的部署成本…

java中类本身是用this_Java语言:this用法

在Java语言中,this在JAVA中所代表的意思是当前类中的意思. 明确引用的是本类中的属性,希望对大家学习Java语言有所帮助。1. 在构造方法或是set方法中初始化类中的属性.class AA{String name;public AA(String name){this.namename; //如果不写this那肯定…

Weblogic新建域,Weblogic新建部署环境,Weblogic重新构建域

Weblogic新建域,Weblogic新建部署环境,Weblogic重新构建域 蕃薯耀 2018年1月29日 http://www.cnblogs.com/fanshuyao/ 看不到图片请移步:http://fanshuyao.iteye.com/blog/2409648 一、第一步点击:Configuration Wizard 二、第二…

java 类域_JAVA 内部类的外围类私有域获取?

通过反射得到得到了 TalkingClock类中是有个静态方法,并且返回值是私有域的beep。在核心技术卷一中说到有方法可以借助这个方法得到私有域,求解?附上类的代码public class TalkingClock {private int interval;private boolean beep;/*** Con…