mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常相关的知识,希望对你有一定的参考价值。
报错信息如上图
sql语句是 INSERT INTO TB_TEST(ID,NAME,SEX,AGE,REMARK) SELECT '110','名字','1',20,'备注' FROM DUAL
把这句sql放入plsql中执行 是没问题的
但是在mybatis中执行就报错 ORA-00933:SQL 命令未正确结束
请教各位大虾,这个问题如何解决。在线等,谢谢
官网的解释是
允许 JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。
我写成了这样就不报错了
<insert id="saveOperatorAuthorityLink" parameterType="java.util.List" useGeneratedKeys="false"> 参考技术A 你这条语句写法就有问题
1、union all 上下2条sql 取出的列不一致不能 联合。
2、按照你的意思 group by a.orgcode,torg.orgname; 这句应该放在 union all
之前
3、不知道你的具体意思,是联合后在进行分组么,还是只要联合追问
请看清楚问题再回答
INSERT INTO TB_TEST(ID,NAME,SEX,AGE,REMARK) SELECT '110','名字','1',20,'备注' FROM DUAL
就这么一句简单的insert语句而已。哪里有union all 。还group by呢
mybatis 中使用oracle merger into
项目背景:设计到excel导入,数据量也比较大,保证性能的情况下还要考虑到:如果数据中有这条数据的主键,则更新(update),不存在的情况,执行插入(insert)。
mybatis代码:
<insert id="saveOrUpdateBatch" parameterType="java.util.List"> MERGE INTO T_KA02 T USING ( <foreach collection="list" item="item" index="index" separator="union" > SELECT #{item.socSrtDireCd,jdbcType=VARCHAR} AS socSrtDireCd, #{item.socSrtDireNm,jdbcType=VARCHAR } AS socSrtDireNm, #{item.doseForm,jdbcType=VARCHAR } AS doseForm, #{item.ruleUseDm,jdbcType=VARCHAR} AS ruleUseDm FROM DUAL </foreach>) T1 ON (T1.socSrtDireCd= T.SOC_SRT_DIRE_CD) WHEN MATCHED THEN UPDATE SET T.SOC_SRT_DIRE_NM=T1.socSrtDireNm, T.DOSE_FORM=T1.doseForm, T.RULE_USE_DM=T1.ruleUseDm WHEN NOT MATCHED THEN INSERT (SOC_SRT_DIRE_CD,SOC_SRT_DIRE_NM,DOSE_FORM,RULE_USE_DM) VALUES (T1.socSrtDireCd,T1.socSrtDireNm,T1.doseForm,T1.ruleUseDm) </insert>
遇到的问题:
如果数据量太大,则拼接sql时抛异常,大致是说sql语句太长,获取不到完整的套接字。这时候,可以采用分批来执行的方式。我的处理方式大致如下:
@Override public void saveOrUpdateBatch(List<DrugsCatalog> list) { int count=0; int bufSize=200; List<DrugsCatalog> tmpList=new ArrayList<>(); int j=0; for (int i = 0; i < list.size(); i++) { j++; tmpList.add(list.get(i)); if(j==bufSize){ int save = drugsCatalogMapper.saveOrUpdateBatch(tmpList); count+=save; tmpList.clear(); j=0; } } int save2 = drugsCatalogMapper.saveOrUpdateBatch(tmpList); count+=save2; log.info("成功导入数据"+count+"条!"); }
这是,完美解决批量保存或更新问题。
以上是关于mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常的主要内容,如果未能解决你的问题,请参考以下文章
mybatis insert into select 丢失数据!
避免在 SQL Server 中的 INSERT INTO SELECT 查询中重复