簡體   English   中英

ORA-01438: 大於指定精度的值允許此列

[英]ORA-01438: value larger than specified precision allows for this column

我們有時會從合作伙伴的數據庫中收到以下錯誤:

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

此錯誤的原因可能是什么?

您要存儲的數字對於該字段來說太大了。 看看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

錯誤似乎不是字符字段之一,而是更多數字字段。 (如果它是像WW提到的字符串問題,你會得到'值太大'或類似的東西。)可能你使用的數字超過了允許的數字,例如1,000000001在一個定義為數字的列中(10,2) )。

查看WW提到的源代碼,找出可能導致問題的列。 然后檢查那里正在使用的數據。

這表明您正試圖將一些太大的東西放入一列。 例如,您有一個VARCHAR2(10)列,並且您輸入了11個字符。 數字也一樣。

這發生在UMAIN包的第176行。 你需要去看看它,看看它到底是什么。 希望您可以在源代碼管理(或來自user_source)中查找它。 更高版本的Oracle更好地報告此錯誤,告訴您哪個列和哪個值。

除了之前的答案之外,您應該注意,定義為VARCHARS(10)的列將存儲10 個字節 ,而不是10個字符,除非您將其定義為VARCHAR2(10 CHAR)

[OP的問題似乎與數字有關......這是為了防止其他人有類似的問題]

我遇到的一個問題是,非常棘手,OCI調用描述列屬性的行為取決於Oracle版本。 描述在沒有任何prec或scale的情況下創建的簡單NUMBER列會在9i,10g和11g上返回differentyty

來自http://ora-01438.ora-code.com/(Oracle支持以外的權威資源):

ORA-01438 :大於此列允許的指定精度的值
原因 :插入或更新記錄時,輸入的數值超出了為列定義的精度。
操作 :輸入符合數字列精度的值,或使用帶有ALTER TABLE命令的MODIFY選項來擴展精度。

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

ORA-06512 :at stringline string
原因 :由於未處理的異常解除了堆棧的回溯消息。
操作 :修復導致異常的問題或為此條件編寫異常處理程序。 或者您可能需要聯系您的應用程序管理員或DBA。

定義如下變量可能是一個好習慣:

v_departmentid departments.department_id%TYPE;

不像下面:

v_departmentid NUMBER(4)

僅供參考:數字字段大小違規將使ORA-01438:值大於此列允許的指定精度

VARCHAR2字段長度違規將使ORA-12899:值對於列太大...

Oracle根據錯誤代碼和消息區分列的數據類型。

如果您使用 PHP 和綁定整數變量(oci_bind_by_name 和 SQLT_INT),也可能會得到此錯誤代碼。 如果您嘗試通過綁定變量插入 NULL,那么您會收到此錯誤,或者有時會插入值 2(這更糟)。

要解決此問題,您必須改為將變量綁定為固定長度的字符串 (SQLT_CHR)。 在插入之前必須將 NULL 轉換為空字符串(在 Oracle 中等於 NULL),並且所有其他整數值必須轉換為其字符串表示形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM