我们的合作伙伴数据库有时会收到以下错误:
<i>ORA-01438: value larger than specified precision allows for this column</i>
完整回复如下所示:
<?xml version="1.0" encoding="windows-1251"?>
<response>
<status_code></status_code>
<error_text>ORA-01438: value larger than specified precision allows for this column ORA-06512: at "UMAIN.PAY_NET_V1_PKG", line 176 ORA-06512: at line 1</error_text>
<pay_id>5592988</pay_id>
<time_stamp></time_stamp>
</response>
导致此错误的原因是什么?
答案 0 :(得分:9)
您要存储的号码对于该字段来说太大了。看看SCALE和PRECISION。两者之间的差异是您可以存储的小数位前面的位数。
select cast (10 as number(1,2)) from dual
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
select cast (15.33 as number(3,2)) from dual
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
低端的任何东西都会被截断(静默)
select cast (5.33333333 as number(3,2)) from dual;
CAST(5.33333333ASNUMBER(3,2))
-----------------------------
5.33
答案 1 :(得分:6)
错误似乎不是字符字段之一,而是更多数字字段。 (如果它是像WW提到的字符串问题,你会得到'值太大'或类似的东西。)可能你使用的数字比允许的数字多,例如列中定义为数字(10,2)的1,000000001。
查看WW提到的源代码,找出可能导致问题的列。然后检查那里正在使用的数据。
答案 2 :(得分:3)
这表示您正在尝试将一些太大的内容放入列中。例如,您有一个VARCHAR2(10)列,并且您输入了11个字符。数字也是一样。
这发生在UMAIN包的第176行。你需要去看看它,看看它到底是什么。希望您可以在源代码管理(或来自user_source)中查找它。更高版本的Oracle更好地报告此错误,告诉您哪个列和哪个值。
答案 3 :(得分:2)
除了之前的答案之外,您应该注意,定义为VARCHARS(10)的列将存储10个字节,而不是10个字符,除非您将其定义为VARCHAR2(10 CHAR)
[OP的问题似乎与数字有关......这是为了防止其他人有类似的问题]
答案 4 :(得分:1)
我遇到的一个问题是,非常棘手,OCI调用描述列属性的行为取决于Oracle版本。描述在没有任何prec或scale的情况下创建的简单NUMBER列会在9i,10g和11g上返回differentyty
答案 5 :(得分:1)
来自http://ora-01438.ora-code.com/(Oracle支持以外的权威资源):
ORA-01438 :大于此列允许的指定精度的值
原因:插入或更新记录时,输入的数值超出了为列定义的精度。
操作:输入符合数字列精度的值,或使用带有ALTER TABLE命令的MODIFY选项来扩展精度。
http://ora-06512.ora-code.com/:
ORA-06512 :at stringline string
原因:Backtrace消息,因为堆栈是由未处理的异常解开的
操作:修复导致异常的问题或为此情况编写异常处理程序。或者您可能需要联系您的应用程序管理员或DBA。
答案 6 :(得分:0)
定义如下变量可能是一个好习惯:
v_departmentid departments.department_id%TYPE;
不像下面这样:
v_departmentid NUMBER(4)
答案 7 :(得分:0)
供参考: 数字字段大小违规将给出 ORA-01438:大于此列允许的指定精度的值
VARCHAR2字段长度违规将给出 ORA-12899:列太大......
Oracle根据错误代码和消息区分列的数据类型。