关于oracle批量插入数据遇到的问题

截取部分日志信息:

2015-09-01 14:48:47,132 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
2015-09-01 14:48:47,178 INFO [org.springframework.jdbc.support.SQLErrorCodesFactory] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]
org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

查找原因:

报异常原因:向数据库执行插入日志数据操作时,user_agent字段值过长,如果是varchar2类型的,varchar2类型最大长度是4000,当超过4000,oracle会自动将该字段值转为long型的,然后,插入操作失败。解决办法是:将此字段的类型改为clob或者blob类型;

下面是解决办法【因为之前这张表中有数据,所以新添加一列,进行复制数据】:

--添加一个clob类型字段 ,clob不需指定长度
alter table log_access add (userAgent_bak  clob);

--将原来的值拷贝到新建的字段

update log_access a set a.useragent_bak = a.user_agent;

--删除原来的字段
alter table log_access drop column useragent_bak

--将新建的clob字段修改为原来的字段名称
alter table log_access rename column useragent_bak to user_agent

commit。

一直考虑着新增字段,修改字段类型,其实插入的数据是日志信息,一些数据可以通过后台进行截取,这样就不用修改字段类型了。

网上看到造成该问题的原因,收集如下:

报错“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”,可能有以下几种原因:
1、插入到字符串长度大于4000字节。
2、插入到表中的记录的某个字段数据的实际长度大于2000个字节(如果是UTF-8,则是1333个字节);或者是插入的记录中有两个或两个以上长度大于2000字节的字符串。
3、数据库与客户端的JDBC驱动不匹配。
对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中为varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超过4000的当做LONG型处理,你的表中有两个这样的字段,插入数据时相当于同时操作2个LONG字段。

clob与blob的区别:

1.BLOB   

 BLOB全称为二进制大型对象(Binary   Large   Object)。它用于存储数据库中的大型二进制对象。可存储的最大大小为4G字节   

2.CLOB   
CLOB全称为字符大型对象(Character   Large   Object)。它与LONG数据类型类似,只不过CLOB用于存储数据库中的大型单字节字符数据块,不支持宽度不等的字符集。可存储的最大大小为4G字节   

原文地址:https://www.cnblogs.com/yangh965/p/4776605.html