ORA-12899: 列”UserName”.”TableName”.”Column”的值太大(实际值: m ,最大值:n ) 问题解决
2014-11-21 16:43
435 查看
前两天操作数据库表,里面有一个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 ……
至此,问题勉强解决。
如果有更好的解决办法,请告知,谢谢!
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 ……
至此,问题勉强解决。
如果有更好的解决办法,请告知,谢谢!
相关文章推荐
- 解决 android 下sqlite3_column_table_name 编译不过的问题
- 创建表事报错:ORA-01950: no privileges on tablespace 'tablespace_name‘ 解决
- Oracle: ORA-01000: 超出打开游标的最大数问题及解决办法
- 解决MYSQL访问时无法切换数据库的问题.Reading table information for completion of table and column names
- ORA-01000: 超出打开游标的最大数 问题的分析和解决
- select * from (select * from tablename) 不可以 问题解决
- 关于报错"ORA-01747: user.table.column, table.column 或列说明无效"的解决办法
- 解决数据库 data too long for column 'name' at row 1的问题
- ORA-12899: 列 XX 的值太大 (实际值: 521, 最大值:512)
- ORA-12899:列"DP"."META_KPI"."KPI_UNIT"的值太大(实际值:24,最大值20)
- ORA-01000: 超出打开游标的最大数 问题的分析和解决
- 解决 Select * from TableName where ID in (@ids) 问题
- 解决异常-ORA-01747 invalid user.table.column, table.column, or column specification
- ORA-12899: 列 "SCOTT"."DEPT"."ID" 的值太大 (实际值: 29, 最大值: 22)
- Oracle 关于报错"ORA-01747: user.table.column, table.column 或列说明无效"的终极解决办法
- ORA-22913: must specify table name for nested table column or attribute
- Ado.Net间歇性问题的一种解决办法 :Column 'column' does not belong to table Table
- 协议适配器错误和ORA-01017: invalid username/password; logon denied,oracle服务器端和客户端同时安装问题解决
- ORA-12899: 列 "RC"."MM_PACKAGE"."PACKAGE_DESC" 的值太大 (实际值: 1262, 最大值: 1024)
- 利用动态规划解决实际问题之多次兑换获取最大外汇收益