4

私は製造エラーのトラブルシューティングに 1 週​​間取り組んでいました。

私は最終的に、すべての混乱を引き起こしている犯人の記録を見つけることができるポイントを得ました.

次のエラー メッセージが表示されます。

java.sql.SQLException: [BEA][Oracle JDBC Driver][Oracle]ORA-01438: value larger than specified precision allows for this column

最終的に、これは間違ったデータである可能性があると思われるすべての情報から、システムは挿入しようとしています:

10385274000

NUMBER(10)に

その値が適合するかどうかはどうすればわかりますか?

ありがとうございました

編集

ミシェル・トッドの提案によると:

create table xyz( testfield number( 10 ) );

insert into xyz values( 10385274000 )


Error: ORA-01438: value larger than specified precision allowed for this column

君たちありがとう!!!

ありがとうスタックオーバーフロー

編集

自分へのメモ (何が問題だったかを忘れないように)

イベントの時間をデータベーステーブルに保存するこのOracle製品がありました

START_TIME|END_TIME

毎晩、この情報を別のテーブルにバックアップしますが、その過程で変換を実行します。次のように保存されます。

TOTALTIME

問題は、このフィールドが ENDTIME - STARTTIME を減算して計算されるときに発生します。結果の数値は、次のように定義されたこの列に格納されます: NUMBER(10)

END_TIME-START_TIME が時間的に離れすぎている場合 (約 4 か月程度)、値 (ミリ秒単位) が非常に大きくなり、ターゲット列に収まらないことがわかります (endTime のようなものがあると思います)。 .getTime() - コード内の startTime.getTime() )

これはすべて簡単すぎてばかげているように思えますが、これを見つけるのに4日以上かかりました.

これを見つけるには、プロセス全体をリバースエンジニアリングする必要がありました(古い意味で、手動で、明らかにソースなしで)。

私がそれを行ったとき、「手書きのマイグレーター」で同じエラーが発生し、その解決方法を見つけました!

4

1 に答える 1

12

NUMBER(10) の数値 10 は、フィールド サイズを指定します。つまり、フィールドには最大 10 文字の数値を保持できます。番号は 11 桁なので、値が大きすぎて収まりません。(<) 100 億 (10 000 000 000) より小さいものは問題なく挿入できます。挿入する前に値を検証する場合は、これを確認する必要があります。

于 2009-08-01T01:15:58.607 に答える