日期:2014-05-16  浏览次数:20586 次

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驱动替換原有的驅動。

我直接在数据库中操作的,应该说是用不到这些驱动的。此法不可用于我的情况。

?


ORA-01461: can bind a LONG value only for insert into a LONG column
????? 开发项目,今天又难到问题。junit测试写数据到oracle时,出现:ORA-01461: can bind a LONG value only for insert into a LONG column错 误,郁闷,试了几次发现,中文才会有这个问题,而且jsp页面里输入的中文又不会报这个错(前端是struts)。像mysql的话,很有可能是数据库字 符编码问题,就怀疑是否为字符编码问题(这种思维不知道会不会很傻),因为项目所有编码都是utf-8, 看了下oracle是zhs16GBK。然后就建一个gbk的项目来测试,结果还是出现此问题。后来就换用旧系统的classes12.jar驱动测试 下,^_^, 不会了,太好了。看了下classes12.jar的版本是9.0.2.0.0的而且又是classes12.jar不爽,后来看到一个帖子,说:用9的和10.2的没有此问题,我回去看下之前出问题的版本是10.1.0.2.0,郁闷,用的数据库是10.2.0.1.0。马上换成10.2.0.1.0的版本。当初不注意,今天花了我几个小时。我一直以为jdbc是数据库对应的。

对应的jdbc在oracle安装目录可以找到oracle\product\10.2.0\db_1\jdbc\lib\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?
}

2. 如果使用Spring的这个Clob类型就需要在applicationContext.xml中的sessionFactory bean里注入oracleL