mybatis oracle批量新增解决方案

老吴2018-11-03 12:19数据库392浏览


版权声明:本篇文章为原创文章,转载请注明出处。https://yao2san.com/article/1675

场景:业务中有一对多的关系,需要批量插入数据。并且没有自增主键。

遇到的问题:最开始将<foreach>放在insert外层,但是插入失败,报错:命令未正确结束;后来改为:

insert into table_name
<foreach collection="list" item="item" separator="UNION">
    select
    xxx.nextval,
    #{val1},
    #{val2},
    from dual
</foreach>

报错:ora-02287 此处不允许序号

原因:■ A SELECT statement that is combined with another SELECT statement with the
UNION, INTERSECT, or MINUS set operator

很明显的是因为使用了UNION导致的错误。

解决办法:据网上所说,在select外面在包一层,如下:

insert into table_name
<foreach collection="list" item="item" separator="UNION">
    select
    xxx.nextval,
    t.t1,
    t.t2,
    from(
    select
    #{val1}, t1,
    #{val2}, t2,
    from dual
    )t
</foreach>

这样就不会报错了。

另外,如果在mybatis中执行多条语句,应该使用begin … end;包起来,否则会报错:命令位正确结束。但是mysql里好像不用。

最终解决方法:使用mybaits<foreach>进行批量插入,如下,如果使用的是自增序列,则需要在select外面再包一层:

<if test="filterChanelIds!=null">
    insert into table_name
        <foreach collection="list" item="item" separator="UNION">
            select
            xxx.nextval,
            t.t1,
            t.t2,
            from(
            select
            #{val1}, t1,
            #{val2}, t2,
            from dual
            )t
        </foreach>
</if>

赞一个! (1)

文章评论(如需发表图片,请转至留言)