Mybaits批量数据插入Oracle报错

在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的语法不支持`,`分隔。

你可能感兴趣的:(Java开发)