Mybatis插入Oracle数据库数据抛出:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值异常的解决办法

异常图

1 检查插入的值是否大于该字段数据类型约束的长度

  这是最常见的解决办法,从字面意思就是说插入的字段长度超过了最大长度。这里不多解释,只需要加大长度。

2 可能是使用虚表dual导致类型转换出错

  有可能在检查之后发现插入的字段数据并没有超过最大长度,但是还是报错。那么可能跟我们的sql语句有关。
  我们在使用oracle进行批量插入数据的时候,可能会有这样的写法:

    insert into XX (ID, xxx,yyy) SELECT XX_SEQUENCE.nextval as ID, A.*
    FROM (
    <foreach collection="list" item="item" index="index" separator="UNION ALL">
        SELECT
        #{item.xxx,jdbcType=VARCHAR}, #{item.yyy,jdbcType=BLOB},
        FROM dual
    </foreach>
    ) A

  :上面的XX_SEQUENCE.nextval as ID是oracle逐渐自增的语法,XX_SEQUENCE为自己的索引名。
  这样的写法一般是没有问题的,但是注意如果我们从dual中获取的字段的jdbcType类型有blob或者clob类型的时候,会将blob、clob对象的字段转为Long型。blob和clob转为long之后长度就很容易超出范围了。因此,这里建议:

  1. 插入一条数据的时候,采用insert into value()语法
  2. 插入一批数据的时候,用到begin end语法

  insert into value()大家基本都会,下面看看begin end语法的语法:

        begin
        <foreach collection="list" item="item" index="index" separator=";">
            insert into XX ( ID, xxx, yyy)
            values(XX_SEQUENCE.nextval, #{item.xxx,jdbcType=VARCHAR},
            #{item.yyy,jdbcType=BLOB})
        </foreach>
        ;end;

  begin …end的意义可以理解为SQL语句执行的上下限,begin 是上限,SQL开始的地方,end是下限sql语句结束的地方,表示一个语句块,用于一次提交大量sql语句,减少数据库连接。
  begin end之间的语句会算作同一个事务,除非中途加入了commit。
  使用begin end需要注意的是,每个sql语句都要确保以“;”结尾,代表一句sql结束。

发布了58 篇原创文章 · 获赞 105 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43767015/article/details/105000451