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

aemubtdh  于 2023-10-16  发布在  Oracle
关注(0)|答案(9)|浏览(232)

我们有时会从合作伙伴的数据库中获得以下错误:

<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>

这个错误的原因是什么?

w8biq8rn

w8biq8rn1#

您尝试存储的数字对于字段来说太大。看看规模和精度。两者之间的区别是您可以存储的小数位前面的位数。

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
zlwx9yxi

zlwx9yxi2#

错误似乎不是一个字符字段,但更多的是一个数字。(如果是像WW提到的字符串问题,你会得到一个“值太大”或类似的东西。)1,000000001在定义为数字(10,2)的列中。
查看WW提到的源代码,找出可能导致问题的列。然后检查数据,如果可能的话,正在使用那里。

ao218c7q

ao218c7q3#

根据前面的答案,您应该注意,定义为VARCHAR(10)的列将存储10字节,而不是10个字符,除非您将其定义为VARCHAR 2(10 CHAR)
[The问题似乎与数字有关。这只是以防万一其他人也有类似的问题]

mmvthczy

mmvthczy4#

这表明您试图将太大的内容放入列中。例如,您有一个VARCHAR2(10)列,您要输入11个字符。数字也是一样。
这发生在包UMAIN的第176行。你需要去看看它到底在做什么。希望你可以在你的源代码控制中(或者从user_source)找到它。Oracle的后续版本更好地报告了此错误,告诉您是哪一列和值。

kxeu7u2r

kxeu7u2r5#

仅供参考:数字字段大小违规将给予ORA-01438:值大于此列允许的指定精度
VARCHAR 2字段长度违规将导致给予ORA-12899:值对于列太大...
Oracle根据错误代码和消息区分列的数据类型。

uurv41yg

uurv41yg6#

我遇到的一个非常棘手的问题是,OCI调用描述列属性的行为因Oracle版本而异。描述一个没有任何prec或scale的简单的NUMBER列,在9i、10g和11g上返回不同的结果

o0lyfsai

o0lyfsai7#

来自http://ora-01438.ora-code.com/(Oracle支持之外的权威资源):

  • ORA-01438*:值大于此列允许的指定精度
    原因:插入或更新记录时,输入的数值超过了为该列定义的精度。
    操作:输入一个符合数值列精度的值,或者使用ALTER TABLE命令中的MODIFY选项扩展精度。

http://ora-06512.ora-code.com/

  • ORA-06512*:在字符串
    原因:未处理异常,堆栈展开时的回溯消息。
    Action:修复导致异常的问题,或者针对此情况编写异常处理程序。或者您可能需要联系您的应用程序管理员或DBA。
nnt7mjpx

nnt7mjpx8#

定义如下变量可能是一个很好的做法:

v_departmentid departments.department_id%TYPE;

不像下面:

v_departmentid NUMBER(4)
fcg9iug3

fcg9iug39#

如果您使用PHP和绑定的整型变量(oci_bind_by_name with SQLT_INT),也可能得到此错误代码。如果你试图通过绑定变量插入NULL,那么你会得到这个错误,或者有时会插入值2(这更糟糕)。
要解决这个问题,您必须将变量绑定为固定长度的字符串(SQLT_SQLT)。在插入之前,NULL必须转换为空字符串(在Oracle中等于NULL),所有其他整数值必须转换为它的字符串表示形式。

相关问题