项目场景:

springboot+mybatis项目中批量插入数据到oracle数据库。


问题描述

在springboot+mybatis项目中做批量插入数据到oracle数据库的功能事,遇到了问题,不能正常插入,现记录该问题。
在mapper文件中书写的批量插入的SQL语句如下

    <insert id="batchInsert">
            insert into ZBXT_WD_ZKGZB
            ( RULE_ID,
            ZKBDM,
            ZKZDDM,
            ZKBMC,
            ZKZDMC,
            ZKGLB,
            ZKGLZD,
            ZKLX,
            BCLX,
            ZYZD,
            YXX,
            CREATE_TIME,
            CREATE_USER)
            values
        <foreach collection ="list" item="rule" separator=",">
            (#{rule.ruleId},
            #{rule.zkbdm},
            #{rule.zkzddm},
            #{rule.zkbmc},
            #{rule.zkzdmc},
            #{rule.zkglb},
            #{rule.zkglzd},
            #{rule.zklx},
            #{rule.bclx},
            #{rule.zyzd},
            #{rule.yxx},
            #{rule.createTime},
            #{rule.createUser})
        </foreach>
    </insert>

在执行的时候,抛出异常如下:

原因分析:

根据异常提示的信息多次检查SQL语句,并未发现错误。
于是通过多次百度终于得知原因:Oracle的批量插入的方式与MySQL批量插入数据的方式并不相同,上述SQL语句在MySQL数据库中能够成功执行,但是在Oracle中,该SQL语句不符合语法规范。


解决方案:

Oracle中批量插入SQL语句:

    <insert id="batchInsert">
        insert all
        <foreach collection ="list" item="rule" >
            into ZBXT_WD_ZKGZB( RULE_ID,
            ZKBDM,
            ZKZDDM,
            ZKBMC,
            ZKZDMC,
            ZKGLB,
            ZKGLZD,
            ZKLX,
            BCLX,
            ZYZD,
            YXX,
            CREATE_TIME,
            CREATE_USER) values
            (#{rule.ruleId},
             #{rule.zkbdm},
             #{rule.zkzddm},
             #{rule.zkbmc},
             #{rule.zkzdmc},
             #{rule.zkglb},
             #{rule.zkglzd},
             #{rule.zklx},
             #{rule.bclx},
             #{rule.zyzd},
             #{rule.yxx},
             #{rule.createTime},
             #{rule.createUser})
        </foreach>
        select 1 from dual
    </insert>

使用上述SQL语句替换之前的SQL语句,重新执行,批量插入成功。

总结

之所以出现上面的错误,是因为对oracle数据库的多行插入语句不够了解。oracle数据库的插入多行数据和mysql数据库中插入多条数据的SQL语句并不相同
在mysql中插入多行数据的语法如下:

INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com'),
(12, 'user1', 'user1', 'xxxx@163.com'),
(18, 'user2', 'user2', 'xxxx@163.com');

在oracle中插入多行数据的语法如下:

INSERT ALL
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;

更多推荐