注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

案例分析:ORA-01461错误  

2008-09-24 13:14:45|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

ORA-01461 错误

can bind a LONG value only for insert into a LONG column

案例1:

我的ORACLE表里没有long字段,可是保存时报错:

ORA-01461 :仅可以为插入LONG列的LONG值赋值

IXDBA.NET技术社区

本来我这张表里只有一个VARCHAR2(4000)的字段,一直没有这种错误发生,后来我把另一个字段长度调整为VARCHAR2(4000),这错误就开始发生了。

 

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

建议减小字段长度或拆分

案例2:

今天接到开发人员报告:在用jdbc导入数据时遇到ORA-01461

ORA-01461 can bind a LONG value only for insert into a LONG column

Cause: An attempt was made to insert a value from a LONG datatype into another datatype. This is not allowed.

Action: Do not try to insert LONG datatypes into other types of columns.

这个错误一般发生在插入或者更新Varchar2类型的字段

实际引起这个错误的主要原因是字符集问题及字符串长度到原因,根据本人遇到到情况一共分两种:

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

2、插入到表中的记录其中一个是long类型、还有其他实际长度大于2000个字节(如果是UTF-8,则是1333个字节);或者是插入的记录中有两个或两个以上长度大于2000字节的字符串

用以下SQL可以查出有可能引起ORA-01461错误的表:

SELECT * FROM

(SELECT TABLE_NAME, OWNER, count(*) NUM

FROM DBA_TAB_COLUMNS

WHERE DATA_TYPE='LONG'

OR (( DATA_TYPE='VARCHAR2'

or DATA_TYPE='CHAR'

or DATA_TYPE='NVARCHAR2'

or DATA_TYPE='NCHAR')

AND DATA_LENGTH > 1333)

AND OWNER NOT IN

('SYS','SYSTEM','SH','OLAPSYS','MDSYS','WKSYS','ODM','XDB','WMSYS')

GROUP BY TABLE_NAME, OWNER)

WHERE NUM > 1

在本例中,更好是插入到记录有2个字段长度大于2000,由于数据库字符集不可更改,故结合实际业务逻辑,将插入记录到其中一个字符串长度缩减在2000字节以下,解决连问题.

本人在存入数据库前先判断一下String 的字节数在入库 ,例: string.getBytes().length<MAXLENGTH (varchar的长度)

  评论这张
 
阅读(547)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017