0

データのDB2エクスポート(約7 GB)と関連するDB2制御ファイルが与えられました。私の目標は、すべてのデータをOracleデータベースにアップロードすることです。私はこれにほぼ成功しました-制御ファイルをSQL*Loader CTLファイルに変換するルートを取りましたが、ほとんどの部分で機能しました。

ただし、一部のデータファイルには、データベースに読み込まれる一部の列にターミネータとジャンクデータが含まれているため、そのデータの照合で明らかな問題が発生することがわかりました。たとえば、列には「9930027130」が含まれている必要があり、length(trim(col))= 14:4バイトのジャンクデータが表示されます。

私の質問は、システムからこのジャンクデータを排除するための最良の方法は何ですか?CTLファイルに単純な追加があり、ジャンクをスペースに置き換えることができるといいのですが、そうでない場合は、SQL * Loaderを実行する前に、データを分析してnull/ジャンクをスペースに置き換えるスクリプトを作成することしか考えられません。

4

2 に答える 2

2

正確には、あなたの「ジャンク」の定義は何ですか?

たとえば、列に10文字のデータのみを含める必要があることがわかっている場合はNULLIF( LENGTH( <<column>> ) > 10 )、制御ファイルにを追加できます。列に数字(または英数字)のみを含める必要があることがわかっている場合は、カスタムデータクレンジング関数(つまりSTRIP_NONNUMERIC)を記述し、それを制御ファイルから呼び出すことができます。

COLUMN_NAME  position(1:14)  CHAR "STRIP_NONNUMERIC(:LAST_NAME)",

要件によっては、これらのクレンジング機能とクレンジングロジックがかなり複雑になる可能性があります。毎晩大量のデータをロードおよびクレンジングするデータウェアハウスでは、すべてのデータを1つのステップでロードおよびクレンジングしようとするのではなく、データクレンジングおよび検証ルールの連続ラウンドが適用されるため、データは通常、一連のステージングテーブルを介して移動されます。 。一般的なアプローチは、たとえば、SQL * Loader(または外部テーブル)を介したクレンジングなしで、すべてのデータをVARCHAR2(4000)列にロードすることです。次に、別のプロセスでデータを適切なデータ型のステージングテーブルに移動し、変換できなかったデータ(つまり、NUMBER列の非数値データ、不可能な日付など)をNULLにします。別のプロセスが発生し、データを別のステージングテーブルに移動して、ドメインルールを適用します。たとえば、社会保障番号は9桁、緯度は-90〜90度、または州コードは状態ルックアップテーブルにあります。検証の複雑さに応じて、データを追加のステージングテーブルに移動して、これまで以上に厳格な検証ルールのセットを適用するプロセスが増える場合があります。

于 2011-02-04T00:45:19.857 に答える
1

「列には「9930027130」が含まれている必要があり、length(trim(col))= 14:4バイトのジャンクデータが表示されます。」

SELECT DUMP(col)を実行して、奇妙な文字を判別します。次に、それが常に無効であるか、場合によっては有効であるか、または有効であるが誤って解釈されるかを判断します。

于 2011-02-04T02:06:09.743 に答える