0

クライアントサイトから、データベースにロードするための次の抽出ファイルが提供されています。

問題は、特定の行(たとえば、2番目の行)では、CREATED_DATEとLAST_UPDATE_DATEが「ddMmm YYYY ...」の日付形式であり、残りの行(上部など)が「YYYY-」の形式である場合です。 MM-DD HH24.MI.SSXFF "

PRIMARY_ID  ID VALUE       CREATED_DATE          LAST_UPDATE_DATE
20166267    20834830491    2012-04-30 08:18:00   2012-04-30 08:18:00
20166536    9112           01 Oct 2010 17:27:04  01 Oct 2010 17:27:04

私の質問は次のとおりです。Q1。抽出を要求する必要をなくすために、SQLローダーで.ctlスクリプトを使用して、インポート時にこれらの「dd Mmm YYYY ...」形式の日付を操作できますか?現在、私の.ctlは

私の.ctlファイルは、以下を使用してインポートするようにスクリプト化されています。

IDENTIFIER_START_DATE   TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF",
LAST_UPDATE_DATE        TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF"

Q2。このような状況でのベストプラクティスとして、要求されたすべての日付形式での再抽出を単に要求しているだけですか?

4

2 に答える 2

2

データの再抽出を要求するかどうかは、いくつかの要因によって異なります。

  • これは1回限りのプロセスですか、それとも継続的なデータフィードですか。外れ値を目で確認しやすい場所で、1回限りのデータのロードで最善を尽くそうとするのは完全に合理的かもしれません。進行中のデータフィードを管理する場合は、問題のある行を手動で検査するよりも、ファイルの厳密な標準に同意する方が一般的にはるかに理にかなっています。
  • クライアントには、ロードプロセスをシンプルで繰り返し可能にするインセンティブがありますか?または、クライアントは、提供したい形式でデータをロードするために固定価格で販売されましたか?クライアントがロードプロセスをシンプルで繰り返し可能にするインセンティブを持っている場合、クリーンなファイルを生成するために時間を費やすことは理にかなっています。一方、ファイルを一貫性のあるデータに変換するために必要な作業に対して固定価格を販売した場合、その作業の多くを彼らに押し戻すと、おそらく彼らは喜ばないでしょう。
  • データがあいまいな行はありますか?たとえば、「01-02-03」は、2003年1月2日、1903年1月2日、2001年2月3日、またはその他のいくつかの日付を指します。あいまいな場合は、再抽出を要求するのが理にかなっています。

データのロード方法に関しては、これを1つのステップで実行することは可能ですが、通常は実行したくないでしょう。一般に、すべての列がとして宣言されているステージングテーブルにデータをロードする(または外部テーブルを使用する)ことでVARCHAR2、データを適切なデータ型に変換する(およびデータのエラーをログに記録する)ETLロジックを作成する方が理にかなっています。変換できません)。たとえば、すべての列がとして定義されているステージングテーブルにデータをロードした場合、このスレッドのmy_to_date関数VARCHAR2のようなものを使用して、さまざまな形式のマスクを試して、機能するものを見つけることができます(多くの場合)可能なマスクの場合、その例で行ったように2つのマスクをハードコーディングするのではなく、コレクションを反復処理することをお勧めします)。

もう1つのポイント...OracleDATEは、与えられているデータの精度と思われる時間を秒単位で格納します。したがって、データをDATE列ではなく列にロードする方が理にかなっているように思われTIMESTAMPます。

于 2013-03-07T00:09:09.917 に答える
1

この.ctlスクリプトを使用します。

load data
append
into table schema_name.table_name
fields terminated by ';' optionally enclosed by '"'
(
PRIMARY_ID,
ID_VALUE,
CREATED_DATE "to_date(:CREATED_DATE, case when regexp_substr(:CREATED_DATE,'\w+',1,2)=regexp_substr(:CREATED_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)",
LAST_UPDATE_DATE "to_date(:LAST_UPDATE_DATE, case when regexp_substr(:LAST_UPDATE_DATE,'\w+',1,2)=regexp_substr(:LAST_UPDATE_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)"
)
于 2013-03-07T00:28:16.043 に答える