oracle数据库批量插入
之所以出现上面的错误,是因为对oracle数据库的多行插入语句不够了解。oracle数据库的插入多行数据和mysql数据库中插入多条数据的SQL语句并不相同。
·
项目场景:
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;
更多推荐
已为社区贡献1条内容
所有评论(0)