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関数をどのように呼び出すのですか? (それは可能ですか?)または、唯一の方法は、データステージングのために別のビュー/テーブルを作成し、すべてのデータ変換を行い、ターゲットテーブルにデータを挿入することです。
ありがとうございます!あなたの記録を想定し
はありがとうアレックス、それは魅力のように働いた!しかし、もう2つの質問があります: 1)テキストファイルの特定の値に達したときに読み込みを停止する方法はありますか?(フラットファイルにはこのようなEOFマーカーがあります。### ~~~ EOF ~~~ ## #)。現在、マーカーは不良レコードとして.badファイルに記録されていますが、EOFマーカーの数には一貫性がありません(1つでも4つでもかまいません)。 2)フラットファイルの場所を動的に設定する方法はありますか?毎日フラットファイルの名前が違うのですか?ファイルマスクは –
@UldisBajārsと似ています。最初のEOFマーカーの後のすべてを破棄することを意味するのか、それとも1〜4個のレコードをスキップするのかはわかりません。いずれにしても、新しい質問として詳細や例を尋ねることができます。 'alter table my_tab location( '')でファイル名を変更することができます。名前に日付が含まれていれば、sysdateに基づいてそれを動的に行うことができます。あなたのディレクトリ内の固定名に日々のファイルの名前を変更する/リンクする方が簡単かもしれません。 –
'alter table my_tab location( '')'について知りませんでした。うまくいきます、ありがとうございます!そのEOFマーカーに関して、私のチームリーダーは、今のところ、一時的な解決策として、それらのマーカーを除去するための基本的なシェルスクリプトで十分であると言いました。再度、感謝します! –