ORA-01438:大于指定精度的值允许此列

时间:2008-10-08 04:30:12

标签: sql database oracle plsql ora-01438

我们的合作伙伴数据库有时会收到以下错误:

<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 &quot;UMAIN.PAY_NET_V1_PKG&quot;, line 176 ORA-06512: at line 1</error_text>
  <pay_id>5592988</pay_id>
  <time_stamp></time_stamp>
</response>

导致此错误的原因是什么?

8 个答案:

答案 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根据错误代码和消息区分列的数据类型。