我们有时会从合作伙伴的数据库中获得以下错误:
<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>
这个错误的原因是什么?
9条答案
按热度按时间w8biq8rn1#
您尝试存储的数字对于字段来说太大。看看规模和精度。两者之间的区别是您可以存储的小数位前面的位数。
任何位于低端的内容都会被截断(无提示)
zlwx9yxi2#
错误似乎不是一个字符字段,但更多的是一个数字。(如果是像WW提到的字符串问题,你会得到一个“值太大”或类似的东西。)1,000000001在定义为数字(10,2)的列中。
查看WW提到的源代码,找出可能导致问题的列。然后检查数据,如果可能的话,正在使用那里。
ao218c7q3#
根据前面的答案,您应该注意,定义为VARCHAR(10)的列将存储10字节,而不是10个字符,除非您将其定义为VARCHAR 2(10 CHAR)
[The问题似乎与数字有关。这只是以防万一其他人也有类似的问题]
mmvthczy4#
这表明您试图将太大的内容放入列中。例如,您有一个VARCHAR2(10)列,您要输入11个字符。数字也是一样。
这发生在包UMAIN的第176行。你需要去看看它到底在做什么。希望你可以在你的源代码控制中(或者从user_source)找到它。Oracle的后续版本更好地报告了此错误,告诉您是哪一列和值。
kxeu7u2r5#
仅供参考:数字字段大小违规将给予ORA-01438:值大于此列允许的指定精度
VARCHAR 2字段长度违规将导致给予ORA-12899:值对于列太大...
Oracle根据错误代码和消息区分列的数据类型。
uurv41yg6#
我遇到的一个非常棘手的问题是,OCI调用描述列属性的行为因Oracle版本而异。描述一个没有任何prec或scale的简单的NUMBER列,在9i、10g和11g上返回不同的结果
o0lyfsai7#
来自http://ora-01438.ora-code.com/(Oracle支持之外的权威资源):
原因:插入或更新记录时,输入的数值超过了为该列定义的精度。
操作:输入一个符合数值列精度的值,或者使用ALTER TABLE命令中的MODIFY选项扩展精度。
http://ora-06512.ora-code.com/:
原因:未处理异常,堆栈展开时的回溯消息。
Action:修复导致异常的问题,或者针对此情况编写异常处理程序。或者您可能需要联系您的应用程序管理员或DBA。
nnt7mjpx8#
定义如下变量可能是一个很好的做法:
不像下面:
fcg9iug39#
如果您使用PHP和绑定的整型变量(oci_bind_by_name with SQLT_INT),也可能得到此错误代码。如果你试图通过绑定变量插入NULL,那么你会得到这个错误,或者有时会插入值2(这更糟糕)。
要解决这个问题,您必须将变量绑定为固定长度的字符串(SQLT_SQLT)。在插入之前,NULL必须转换为空字符串(在Oracle中等于NULL),所有其他整数值必须转换为它的字符串表示形式。