首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法

2013-07-08 
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法今天遇到的一个问题:直接修改数据表中的某些字段

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。實例如下:
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法@SuppressWarnings("serial")
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法@Entity
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法@Table(name?=?"GUIDE")
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法//@Cache(usage?=?CacheConcurrencyStrategy.READ_WRITE)
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法public?class?Guide?{
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法????
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法????@Type(type?=?"org.springframework.orm.hibernate3.support.ClobStringType")
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法????private?String?content;?//内容
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????????//get?&?set?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法}
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法
2. 如果使用Spring的这个Clob类型就需要在applicationContext.xml中的sessionFactory bean里注入oracleLobHandler bean。下面給出Oracle數據庫的LobHandler配置:ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法.
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?<?bean??id?="oracleLobHandler"??
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法??????class?="org.springframework.jdbc.support.lob.OracleLobHandler"??
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法??????lazy-init?="true"?>???
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????<?property??name?="nativeJdbcExtractor"??ref?="nativeJdbcExtractor"???/>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?</?bean?>?????
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?<?bean??id?="nativeJdbcExtractor"????????class?="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法??????lazy-init?="true"???/>???
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?<!--??Hibernate?SessionFactory??-->?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?<?bean??id?="sessionFactory"??class?="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"?>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????<?property??name?="dataSource"??ref?="dataSource"???/>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????<?property??name?="configLocation"??value?="classpath:hibernate/hibernate.cfg.xml"???/>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????<?property??name?="hibernateProperties"?>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????????<?value?>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法??????????ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????????</?value?>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????</?property?>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?????<?property??name?="lobHandler"??ref?="oracleLobHandler"???/>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?</?bean?>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法?ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法.
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法
LobHandler 需要访问本地 JDBC 对象,这一任务委托给 NativeJdbcExtractor Bean 来完成,NativeJdbcExtractor是一個本地JDBC對象抽取器,因此我們为 LobHandler 注入了一个 nativeJdbcExtractor。最后,我们把 lobHandler Bean 注入到需要进行 LOB 数据访问操作的sessionFactory Bean中或者直接注入到dao Bean中去。
大家可能已经注意到 nativeJdbcExtractor 和 oracleLobHandler Bean 都设置为 lazy-init="true",这是因为 nativeJdbcExtractor 需要通过运行期的反射机制获取底层的JDBC 对象,所以需要避免在 Spring 容器启动时就实例化这两个Bean。如果底層數據庫是 DB2、SQL Server、MySQL 等非 Oracle 的其它數據庫,则只要简单配置一个 DefaultLobHandler 就可以了,如下所示:
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法<bean?id="defaultLobHandler"?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法alt="ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法">lazy-init="true"/>

ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法<bean?id="testDao"?alt="ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法">???<property?name="lobHandler"?ref="?defaultLobHandler"/>?
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法<property?name="jdbcTemplate"?ref="jdbcTemplate"?/>
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法</bean>
ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决方法
DefaultLobHandler 只是简单地代理标准 JDBC 的 PreparedStatement 和 ResultSet 对象,由于并不需要访问数据库驱动本地的 JDBC 对象,所以它不需要 NativeJdbcExtractor 的帮助。
??? 采用第二種方法即可解決我所遇到的問題,如果再見到“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”時,希望這個方法能夠幫您順利拿下ORA-01461。



PS:給出Oracle下幾種大容量字段類型的解釋LONG:?可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列
LONG RAW: 可变长二进制数据,最长2G
CLOB:? 字符大对象Clob 用来存储单字节的字符数据
NCLOB: 用来存储多字节的字符数据
BLOB: 用于存储二进制数据
BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只读访。但该文件不包含在数据库内。bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复。
  
其中CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有LONG只能有一列的限制。要保存图片、文本文件、Word文件各自最好采用那種数据类型呢?BLOB最好,LONG RAW也不错,但Long是oracle将要废弃的类型,因此建议用BLOB。

?法4:转自http://www.2cto.com/database/201109/106239.html?fw_key=6AA2924B63F8C190

最近做项目,插入数据时遇到了“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个左右的字段跨行跨列的数据

每次只修改一个字段马上提交保存修改,可以不用上传事务。不会报错!后来同时多修改几个字段数据,也偶尔会出现弹出错误的情况。

因为是直接操作数据库表字段,而且工作量较小,故采用手动方式解决,而且是人品爆发,瞎捣鼓成功修改完成。?

刚刚写上面一段记录的时候,为了验证自己的想法,再次对数据库表修改进行测试验证。发现当我修改同一列的数据时不会报这个错误,当我修改不同列的数据时就会报该错误!

这个是有规定的么? ?希望能帮助到人。

?

如果有错,希望有人能够指正,谢谢!

热点排行