2016-06-20 30 views
0

SQLoaderを使用してSQLoaderスクリプトを外部表と置き換えるフラット・ファイルがDBにロードされていますが、SQLoaderの「翻訳」に問題があります外部テーブルに転送します。だから、SQLoaderから外部表[Oracle]

、例えば私は、フラットファイル、このようなものがあります:

~#~col1>|col2>|col3... 

をそして、私はこのような何かに見えるSQloader .CTLファイル、持っている:現時点では

LOAD DATA                  
APPEND 
CONTINUEIF NEXT PRESERVE (1:3) <> '~#~' 
INTO TABLE my_tab 
FIELDS TERMINATED BY ">|" TRAILING NULLCOLS   
(                    
    col1     "LTRIM(Trim(:col1),'~#~')", 
    col2     "TRIM(:col2)",           
    col3     "TRIM(:col3)", 
    col4     CONSTANT #$TASKID$#, 
    col5     CONSTANT #$SESSION$#, 
    col6     RECNUM, 
    col7     SEQUENCE(MAX) 
) 

を私は多くのことを試してみました -

create table my_tab(
    col1 varchar2(100) 
    ,col2 number(38)   
    ,col3 number(38) 
    ,... 
) 
organization external(
    type oracle_loader 
    default directory my_dir 
    access parameters(
     records delimited by newline 
     fields terminated by '>|' 
     missing field values are null 
     reject rows with all null fields 
    ) 
    location('my_file.txt') 
); 

だから私は、次の質問を持っている:

外部テーブルを定義するとき、TRIM関数をどのように呼び出すのですか? (それは可能ですか?)または、唯一の方法は、データステージングのために別のビュー/テーブルを作成し、すべてのデータ変換を行い、ターゲットテーブルにデータを挿入することです。

ありがとうございます!あなたの記録を想定し

答えて

0

はいつもあなたがテーブル定義にマッピングしないダミーの列のカップルとそれを消費することができます~#~始まります:

create table my_tab(
    col1 varchar2(100) 
    ,col2 number(38)   
    ,col3 number(38) 
) 
organization external(
    type oracle_loader 
    default directory my_dir 
    access parameters(
     records delimited by newline 
     fields terminated by '>|' 
     missing field values are null 
     reject rows with all null fields 
     (
     colx char(1) terminated by "~", 
     coly char(1) terminated by "~", 
     col1, 
     col2, 
     col3 
    ) 
    ) 
    location('my_file.txt') 
); 

デフォルトの動作trim clause specifiedのない振る舞いLDRTRIM、ありますSQL * LoaderのTRIMと同じです。また、各列の空白のトリムを指定するには、これをNOTRIMに設定することもできます。


あなたはEOFマーカーレコードを破棄していますが、それらの記録を保持したくない場合は、必要に応じてNODISCARDFILEで、LOAD WHEN optionを使用することができ、他のすべてをロードする場合:

... 
organization external(
    type oracle_loader 
    default directory d42 
    access parameters(
     records delimited by newline 
     load when (1:15) != "###~~~EOF~~~###" 
     nodiscardfile 
     fields terminated by '>|' 
... 
+0

はありがとうアレックス、それは魅力のように働いた!しかし、もう2つの質問があります: 1)テキストファイルの特定の値に達したときに読み込みを停止する方法はありますか?(フラットファイルにはこのようなEOFマーカーがあります。### ~~~ EOF ~~~ ## #)。現在、マーカーは不良レコードとして.badファイルに記録されていますが、EOFマーカーの数には一貫性がありません(1つでも4つでもかまいません)。 2)フラットファイルの場所を動的に設定する方法はありますか?毎日フラットファイルの名前が違うのですか?ファイルマスクは

+0

@UldisBajārsと似ています。最初のEOFマーカーの後のすべてを破棄することを意味するのか、それとも1〜4個のレコードをスキップするのかはわかりません。いずれにしても、新しい質問として詳細や例を尋ねることができます。 'alter table my_tab location( '')でファイル名を変更することができます。名前に日付が含まれていれば、sysdateに基づいてそれを動的に行うことができます。あなたのディレクトリ内の固定名に日々のファイルの名前を変更する/リンクする方が簡単かもしれません。 –

+0

'alter table my_tab location( '')'について知りませんでした。うまくいきます、ありがとうございます!そのEOFマーカーに関して、私のチームリーダーは、今のところ、一時的な解決策として、それらのマーカーを除去するための基本的なシェルスクリプトで十分であると言いました。再度、感謝します! –

関連する問題