今天在排查一个生产问题时,定位到批量插入sql的时候报如下错误:
ORA-01461:仅能绑定要插入 LONG 列的 LONG 值
这个功能是解析一个excel表格,然后将解析的数据批量插入数据库中,
数据库用的是oracle,因为excel里面的数据量比较多,有两千多条,细看也看不出来是为啥报错,没法,我就只有先判断每个字段的字符串长度,因为数据库该列的长度是VARCHAR2(4000),所以我就在数据入库的时候判断了一下字符串长度,超过4000的就不让他插入数据库了。可是奇怪的是,没有任何数据超过了4000的长度,插入数据库依然报上面的错误。controller层入参校验使用的是length()属性获取长度的。
后来,我就把每个字段的长度在日志中打印了出来,发现有一个字段的长度是2097,然后再找到那一列数据,发现那一列数据全部是中文,最后我把那一列数据减少文字,再后台日志输出1888,发现批量插入还是报错,我又修改为1269,最后顺利插入数据库,问题解决。

总结:
当向ORACLE数据库中插入或更新数据时,报错“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”,可能有以下几种原因:

1、插入到字符串长度大于4000字节。

2、插入到表中的记录的某个字段数据的实际长度大于2000个字节(如果是UTF-8,则是1333个字节);或者是插入的记录中有两个或两个以上长度大于2000字节的字符串。(本次我遇到的问题就是在数据库中存储的是中文,超过1333个字节插入数据库就失败了,所以应该在controller层入参校验做判断,判断大于1333个字节就拦截,然后返给前端)

3、数据库与客户端的JDBC 驱动不匹配。对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中为 varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超过 4000的当做LONG型处理,你的表中有两个这样的字段,插入数据时相当于同时操作2个LONG字段。

4、使用9i的及以下的版本引发的bug. 10.1.0.1版本中已经修复bug

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐