9

私は iseries/DB2 にあまり詳しくありません。ただし、それをプライマリ データベースとして使用する Web サイトで作業しています。

最近、新しい列が既存のテーブルに追加されました。AS400 経由で表示すると、次のデータ型が表示されます。

Type: S
Length: 9
Dec: 2

これは、小数点の前に 6 桁、小数点の後に 2 桁の数値フィールドであることがわかります。

単純な SELECT ( SELECT MYCOL FROM MYTABLE) でデータをクエリすると、問題なくすべてのレコードが返されます。ただし、同じ列でDISTINCTGROUP BY、またはを使用しようとするORDER BYと、次の例外が発生します。

[SQL0802] Data conversion of data mapping error

少なくとも 1 つのレコードに無効なデータが含まれていると推測しました。これは、DBA が「空白」または「4 O」と呼んでいるものです。しかし、これはどのように可能ですか?その列に無効なデータを追加しようとすると、データベースは例外をスローするべきではありませんか?

クエリでこれらの不良レコードを除外するなど、これを回避する方法はありますか?

4

4 に答える 4

5

「4 O」は、スペースまたは空白文字の EBCDIC コードである 0x40 を意味し、レコード内の新しいスペースに配置されるデフォルト値です。

レガシ プログラム/操作では、10 進データ エラーが発生する可能性があります。たとえば、オプション付きのCPYFコマンドを使用して新しいファイルが作成され、入力された場合。FMTOPT(*NOCHK)

これを修正する最も簡単な方法は、ファイルを読み取ってレコードを修正する HLL プログラム (RPG) を作成することです。

于 2012-10-25T20:05:38.643 に答える
3

私が見つけた唯一の解決策は、列の空白値をチェックし、見つかったらゼロに更新するスクリプトを作成することでした。

于 2012-12-14T15:40:35.243 に答える
2

ファイルのレコード形式レベルのチェックがオフになっている場合 [つまり、. LVLCHK(*NO)] またはそれにオーバーライドされている場合は、HLL プログラムです。新しいレコードで再コンパイルされなかった (例: RPG、COBOL など) は、特に新しい列がレコードの最後にない場合、この列に無効なデータを含むレコードを書き出す可能性があります。

ネイティブ I/O を使用してこのファイルのレコードを書き込みまたは更新するすべてのプログラムが再コンパイルされていることを確認してください。

于 2012-10-25T20:07:56.620 に答える
1

キー列を整数に強制キャストすることで、このエラーを解決できました。ここからジョインを変えた...

FROM DAILYV INNER JOIN BXV ON DAILYV.DAITEM=BXV.BXPACK

...これに...

FROM DAILYV INNER JOIN BXV ON CAST(DAILYV.DAITEM AS INT)=CAST(BXV.BXPACK AS INT)

...そして、表を修正する必要はありませんでした。これは非常に古く、非常に乱雑なデータベースであり、多くのがらくたが含まれています。多くの修正を加えましたが、進行中の作業です。

于 2018-01-03T13:58:26.543 に答える