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 命令未正确结束

请教各位大虾,这个问题如何解决。在线等,谢谢

参考技术A 我也遇到这个问题,我报错的原因是加了useGeneratedKeys="true"这个,去掉就好了 参考技术B 语句本身确实没有问题,是不是少/多了结尾的分号
有些语言需要这个分号,有些不需要分号追问

mybatis中的sql语句后面都不能跟 ; 分号的。
虽然没解决但还是感谢你的回答。
虽然这个问题没解决,但是我找了其他方法替代,最终的效果是达到了。等我空闲时间了还是要把这个问题再拿出来研究研究的,这个问题我就暂时先不关闭。后面有知道的朋友看到后可以随时回答。

期待你们的答案 确实解决问题的我会马上采纳答案的

参考技术C 请问这个问题你研究出来了吗?怎么解决的?是mybatis的问题吗

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 查询中重复

Merge Into 语句代替Insert/Update在Oracle中的应用实战

mybatis的insert返回主键

mybatis 中使用oracle merger into

mybatis 实现 insert 语句返回 主键