ORA-12899: 列”UserName”.”TableName”.”Column”的值太大(实际值: m ,最大值:n ) 问题解决

前两天操作数据库表,里面有一个remark字段,更改表中的一个记录后,要把更改原因写入remark字段,是添加(append)到这个字段中。直接使用如下的语句:

Update tableA setremark=concat(remark,’new reason’) where ……

会出现这样的错误: ORA-12899: 列”UserName”.”TableName”.”Column”的值太大(实际值: m ,最大值:n )

但使用 length(remark) 查看,即使加上’new reason’的长度也不会超remark定义的长度值。oracle直接使用remark定义的长度值加上新的字符串的长度的值做为新的字段的定义长度值。

由于查看了要修改的remark字段的实际长度值远未达到定义的长度值,所以,使用cast()函数强制将新的remark值强制类型转换,使其实长度符合规定(remark 字段类型定义为varchar2(300) )。

Update tableA setremark=cast(concat(remark,’new reason’) as varchar2(300)) where ……

 

Ps:

由于作批量修改,还是发现少量记录的长度添加新字符串后,长度会超过规定的varchar2(300) 的长度。使用上面的语句,会使新的remark值被截断。

后来发现,由于remark字段中大部分是中文,length(remark)返回的是中文字的个数,比如中文字是200个,但转成varchar2类型,就会超过300。

最后,由于以前的remark值的重要性不那么高,于是使用下面的语句,尽量不要截断新加入的字符值:

Update tableA setremark=cast( substr(concat(remark,’new reason’), -length(remark)+length(‘newreason’)) as varchar2(300)) where ……

至此,问题勉强解决。

 

如果有更好的解决办法,请告知,谢谢!

你可能感兴趣的:(ORA-12899: 列”UserName”.”TableName”.”Column”的值太大(实际值: m ,最大值:n ) 问题解决)