在Mysql下测试的时候,但是把环境换为Oracle的时候批量插入数据报错了。报错如下:
java.sql.SQLException: ORA-00936: 缺失表达式
经在网上查原因是Oracle的语法和Mysql的有区别,因此配置文件有所差异。记录下解决这个问题的两步。
1,是要在mapper文件中声明没有主键。
<insert id="saveCapesValueData" useGeneratedKeys="false" parameterType="java.util.List" >
2,另外当数据库使用Oracle的时候,语句的配置和Mysql的略有区别,具体如下所示:
插入Oracle的配置
<insert id="saveCapesValueData" useGeneratedKeys="false" parameterType="java.util.List" >
insert into capes2_value_data(
col_begintime,
col_endtime,
subkpiname,
sublist,
kpiname,
selectsql,
retrans_num,
kpi_value,
result,
msg,
status)
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT
#{item.colBegintime},
#{item.colEndtime},
#{item.subKpiname},
#{item.subList},
#{item.kpiname},
#{item.selectSql},
#{item.retransNum},
#{item.valueData},
#{item.result},
#{item.msg},
#{item.status}
FROM dual
foreach>
insert>
插入Mysql的配置
<insert id="addCapesLogBath" parameterType="java.util.List">
insert into cap2anls_rcd_xml_data(
login_begin,
login_end,
query_begin,
query_end,
check_begin,
check_end,
col_begintime,
col_endtime,
subkpiname
<foreach collection="list" item="item" index="index" separator=",">
(#{item.loginBegin},
#{item.loginEnd},
#{item.queryBegin},
#{item.queryEnd},
#{item.checkBegin},
#{item.checkEnd},
#{item.col_begintime},
#{item.col_endtime},
#{item.subkpiname}
foreach>
insert>
今天放到生产环境跑又有问题了。报如下错误:
ORA-01461:仅能绑定要插入LONG列的LONG值
解决方法是继续修改配置文件为如下这样,错误原因可能是在表中存在clob类型,select clob from dual的时候会被转换成long因此报错。
<insert id="saveCapesValueData" useGeneratedKeys="false" parameterType="java.util.List" >
BEGIN
<foreach collection="list" item="item" index="index" separator=";">
insert into capes2_value_data(
col_begintime,
col_endtime,
subkpiname,
sublist,
kpiname,
selectsql,
retrans_num,
kpi_value,
result,
msg,
status)
VALUES(
#{item.colBegintime},
#{item.colEndtime},
#{item.subKpiname},
#{item.subList},
#{item.kpiname},
#{item.selectSql},
#{item.retransNum},
#{item.valueData},
#{item.result},
#{item.msg},
#{item.status})
foreach>
;END;
insert>```
总结:
1. 如果数据库使用Oracle,且没有主键,一定要在配置文件中声明。
2. SQL中没有VALUES;
3. <foreach>标签中的(selece ..... from dual);
4. <foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。Oracle的语法不支持`,`分隔。