ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法
今天遇到的一个问题:
直接修改数据表中的某些字段数据内容时报错:
?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法
?
上网查询发现解决途径有:
?法1,数据库字符集应该是UTF-8的,对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义 中为varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超 过4000的当做LONG型处理,你的表中有两个这样的字段,插入数据时相当于同时操作2个LONG字段,所以报错。
?當時的解决办法:建议减小字段长度或拆分。实在需要的,可以转而采用CLOB字段类型。?
?
但我的修改的数据不可能超过这个长度,就像http://www.blogjava.net/allen-zhe/archive/2008/05/06/198627.html?评论1楼所说,我的长度太小,根本不会是这个问题
此法pass!
?
法2,采用Oracle 10g最新的ojdbc14.jar驱动替換原有的驅動。
我直接在数据库中操作的,应该说是用不到这些驱动的。此法不可用于我的情况。
?
?
?法3: 转自?http://www.blogjava.net/allen-zhe/archive/2008/05/06/198627.html
1. Hibernate實體對象中的数据成员类型为String,映射的数据库字段类型为org.springframework.orm.hibernate.support.ClobStringType。實例如下:
@SuppressWarnings("serial")
@Entity
@Table(name?=?"GUIDE")
//@Cache(usage?=?CacheConcurrencyStrategy.READ_WRITE)
public?class?Guide?{
????
????@Type(type?=?"org.springframework.orm.hibernate3.support.ClobStringType")
????private?String?content;?//内容
?????????//get?&?set?
}
?
.
?<?bean??id?="oracleLobHandler"??
??????class?="org.springframework.jdbc.support.lob.OracleLobHandler"??
??????lazy-init?="true"?>???
?????<?property??name?="nativeJdbcExtractor"??ref?="nativeJdbcExtractor"???/>?
?</?bean?>?????
?
?<?bean??id?="nativeJdbcExtractor"????????class?="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"?
??????lazy-init?="true"???/>???
?<!--??Hibernate?SessionFactory??-->?
?<?bean??id?="sessionFactory"??class?="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"?>?
?????<?property??name?="dataSource"??ref?="dataSource"???/>?
?????<?property??name?="configLocation"??value?="classpath:hibernate/hibernate.cfg.xml"???/>?
?????<?property??name?="hibernateProperties"?>?
?????????<?value?>?
??????????
?????????</?value?>?
?????</?property?>?
?????<?property??name?="lobHandler"??ref?="oracleLobHandler"???/>?
?</?bean?>?
?
.
<bean?id="defaultLobHandler"?
alt="ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法">lazy-init="true"/>
<bean?id="testDao"?alt="ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法">???<property?name="lobHandler"?ref="?defaultLobHandler"/>?
<property?name="jdbcTemplate"?ref="jdbcTemplate"?/>
</bean>
最近做项目,插入数据时遇到了“ORA-01461: 仅可以为插入LOGN列的LOGN值赋值”的BUG
oracle中的数据类型为varchar2(4000 byte),插入的数据绝对不超过4000,不为理解?
后改为varchar2(4000 char),LONG,CLOB等类型均不能解决?
google了下,网上的解决方法大多是换驱动或是改数据库类型,试过,无效。?
后发现,我插入的数据长度在1400左右,而oracle在插入[1000~2000]之间的数据时均会报ORA-01461的错,小于1000,或是(2000~4000]之间长度的均可插入。于是做了如下操作,解决问题:
Java代码?
String content = ......;//要插入的数据?
int len = content.getBytes().length;?
if(len >= 1000 && len <= 2000)?
??? content = StringUtils.rightPad(content, 2002);?
?
注:使用StringUtils需要导入commons-lang包,rightPad()意为在右边补空格
Java代码?
StringUtils.rightPad(null, *)?? = null?
StringUtils.rightPad("", 3)???? = "?? "?
StringUtils.rightPad("bat", 3)? = "bat"?
StringUtils.rightPad("bat", 5)? = "bat? "?
StringUtils.rightPad("bat", 1)? = "bat"?
StringUtils.rightPad("bat", -1) = "bat"
作者“三习”
?
法5:http://wenku.baidu.com/view/6101a98bcc22bcd126ff0cea.html
法6:最后自己稀里糊涂地弄出来了
开始修改得比较多,一次性修改了20个左右的字段跨行跨列的数据
每次只修改一个字段马上提交保存修改,可以不用上传事务。不会报错!后来同时多修改几个字段数据,也偶尔会出现弹出错误的情况。
因为是直接操作数据库表字段,而且工作量较小,故采用手动方式解决,而且是人品爆发,瞎捣鼓成功修改完成。?
刚刚写上面一段记录的时候,为了验证自己的想法,再次对数据库表修改进行测试验证。发现当我修改同一列的数据时不会报这个错误,当我修改不同列的数据时就会报该错误!
这个是有规定的么? ?希望能帮助到人。
?
如果有错,希望有人能够指正,谢谢!