本文主要是介绍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之后长度就很容易超出范围了。因此,这里建议:
- 插入一条数据的时候,采用insert into value()语法
- 插入一批数据的时候,用到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结束。
这篇关于Mybatis插入Oracle数据库数据抛出:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值异常的解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!