web-dev-qa-db-ja.com

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>

このエラーの原因は何ですか?

12
user11104

保存しようとしている数がフィールドに対して大きすぎます。 SCALEとPRECISIONを見てください。 2つの違いは、格納できる小数点以下の桁数です。

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
10
Gary Myers

エラーは文字フィールドの1つではなく、数値のフィールドのようです。 (WWで言及したような文字列の問題だった場合、「値が大きすぎます」などの問題が発生します。)使用できる桁数が多すぎる可能性があります。数値(10,2)として定義された列に1,000000001。

WWが言及したソースコードを見て、問題の原因となっている可能性がある列を特定します。次に、可能であればそこで使用されているデータを確認します。

7
Thorsten

これは、大きすぎるものを列に入れようとしていることを示しています。たとえば、VARCHAR2(10)列があり、11文字を入力するとします。番号も同じです。

これは、UMAINパッケージの176行目で発生しています。あなたはそれが何をしているのかを見るために行ってそれを見る必要があるでしょう。うまくいけば、ソースコントロールで(またはuser_sourceから)参照できます。新しいバージョンのOracleでは、このエラーをより適切に報告し、どの列とどの値を通知します。

3
WW.

以前の回答に加えて、VARCHARS(10)として定義された列は、VARCHAR2(10 CHAR)として定義しない限り、10文字ではなく10 bytesを格納することに注意してください。

[OPの質問は数値に関連しているようです...これは、他の誰かが同様の問題を抱えている場合に備えてです]

2
cagcowboy

http://ora-01438.ora-code.com/ から(Oracleサポート外の決定的なリソース):

ORA-01438:この列に許可されている指定された精度よりも大きい値
原因:レコードを挿入または更新するときに、列に定義された精度を超える数値が入力されました。
Action:数値列の精度に準拠した値を入力するか、ALTER TABLEコマンドでMODIFYオプションを使用して精度を拡張します。

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

ORA-06512:at stringline string
原因:スタックが未処理の例外によって巻き戻されたときのバックトレースメッセージ。
Action:例外の原因となっている問題を修正するか、この条件の例外ハンドラーを記述します。または、アプリケーション管理者またはDBAに連絡する必要がある場合があります。

1
warren

私が抱えていた1つの問題であり、ひどくトリッキーだったのは、列の属性を記述するOCI呼び出しがOracleのバージョンによって異なる動作をすることでした。 precまたはscaleなしで作成された単純なNUMBER列を記述すると、9i、10g、11gで違いが返されます

1
Robert Gould

参考:数値フィールドサイズの違反により、ORA-01438:この列に指定された精度よりも大きな値が許可されます

VARCHAR2フィールド長違反は、ORA-12899:列に対して値が大きすぎます...

Oracleは、エラーコードとメッセージに基づいて、列のデータ型を区別します。

0
Priyome

以下のような変数を定義することは良い習慣かもしれません:

v_departmentid departments.department_id%TYPE;

以下のようではありません:

v_departmentid NUMBER(4)
0
gokhant