17

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

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

此错误的原因可能是什么?

4

9 回答 9

16

您尝试存储的数字对于该字段来说太大了。看看规模和精度。两者的区别在于您可以存储的小数点前的位数。

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
于 2010-04-29T23:44:26.613 回答
7

该错误似乎不是字符字段之一,而更多是数字字段。(如果它是像 WW 提到的字符串问题,你会得到一个“值太大”或类似的东西。)可能你使用的数字超出了允许的范围,例如定义为数字的列中的 1,000000001 (10,2 )。

查看 WW 提到的源代码以找出可能导致问题的列。然后检查那里正在使用的数据(如果可能)。

于 2008-10-08T04:56:20.800 回答
3

这表明您正在尝试将太大的内容放入列中。例如,您有一个 VARCHAR2(10) 列,并且要输入 11 个字符。号码也一样。

这发生在包 UMAIN 的第 176 行。你需要去看看它,看看它在做什么。希望您可以在源代码管理(或从 user_source)中查找它。Oracle 的更高版本更好地报告了这个错误,告诉你哪一列和什么值。

于 2008-10-08T04:35:31.280 回答
2

除了先前的答案,您应该注意定义为 VARCHARS(10) 的列将存储 10个字节,而不是 10 个字符,除非您将其定义为 VARCHAR2(10 CHAR)

[OP的问题似乎与数字相关......这是以防万一其他人有类似的问题]

于 2008-10-08T06:49:26.143 回答
2

仅供参考:数值字段大小违规将给出 ORA-01438:值大于此列允许的指定精度

VARCHAR2 字段长度违规将给出 ORA-12899: value too large for column...

Oracle 根据错误代码和消息来区分列的数据类型。

于 2016-06-27T15:14:41.263 回答
1

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

ORA-01438:该列允许的值大于指定的精度
原因:插入或更新记录时,输入的数值超过了为该列定义的精度。
行动:输入一个符合数字列的精度的值,或使用修改选项与 ALTER TABLE 命令来扩大精度。

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

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

于 2008-10-08T14:00:13.263 回答
1

我遇到的一个非常棘手的问题是,描述列属性的 OCI 调用的行为因 Oracle 版本而异。描述在 9i、1Og 和 11g 上创建的没有任何 prec 或比例返回差异的简单 NUMBER 列

于 2008-10-08T05:12:30.690 回答
1

定义如下变量可能是一个好习惯:

v_departmentid departments.department_id%TYPE;

不像下面这样:

v_departmentid NUMBER(4)
于 2010-04-30T02:00:39.077 回答
0

如果您使用 PHP 和绑定整数变量(oci_bind_by_name 和 SQLT_INT),也可能会得到此错误代码。如果您尝试通过绑定变量插入 NULL,那么您会收到此错误,或者有时会插入值 2(这更糟)。

要解决此问题,您必须改为将变量绑定为固定长度的字符串 (SQLT_CHR)。在插入之前必须将 NULL 转换为空字符串(在 Oracle 中等于 NULL),并且所有其他整数值必须转换为其字符串表示形式。

于 2022-01-13T11:13:19.193 回答