mybatis批量插入报 ORA-01461-仅能绑定要插入LONG列的LONG值

一,Mybatis Oracle实现批量插入

<insert id="insertUserBatch" parameterType="java.util.List">
        INSERT INTO table_user (
        id, user_code, user_name
        )
        <foreach collection="userList" item="item" index="index" separator="UNION ALL">
            select
            #{item.id,jdbcType=VARCHAR}, #{item.userCode,jdbcType=VARCHAR}, 
            #{item.userName,jdbcType=VARCHAR}
            from dual
        </foreach>
</insert>

即,Oracle实现批量插入需要借助 dual(其中的一种方式)。这样实现是没有任何问题的。

二,问题

在单条数据插入时,当表中数据有字段当插入数据超过varchar2的长度(4000)时会报 “ORA-01461-仅能绑定要插入LONG列的LONG值”,这个时候只需要将该字段由varchar2类型改成blob类型(mysql)或者clob类型(Oracle)就可以了。但是注意这个是用没有实现批量插入的sql实现:

<insert id="insertUser" parameterType="com.orient.user">
        INSERT INTO table_user (
        id, user_code, user_name
        ) values(
            #{item.id,jdbcType=VARCHAR}, #{item.userCode,jdbcType=VARCHAR}, 
            #{item.userName,jdbcType=VARCHAR}
        )
</insert>

但是用“一”中的方式批量进行插入时即便是将类型改变过来也是报此错误,其主要原因是虚表dual中的字段类型是long类型的,所以还是会报错。

三,解决方案

<insert id="insertUserBatch" parameterType="java.util.List">
        begin
        <foreach collection="userList" item="item" index="index" separator=";">
            INSERT INTO table_user (
            id, user_code, user_name
        ) values(
         #{item.id,jdbcType=VARCHAR}, #{item.userCode,jdbcType=VARCHAR}, 
         #{item.userName,jdbcType=VARCHAR}
        )
        </foreach>
       ;end;
</insert>

即,不用能借助dual表实现,通过sql拼接的方式(脚本)实现。这样就不会报这样的错误了!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值