2016-07-05 12 views
0

第一質問を複数のCSVファイルをロードする方法:私はtest1.csvtest2.csvtest3.csvTABLE1table2の表3へのロードしようとしていますそれぞれSQLLDRを使用しています。この分野の知識があれば、.ctlファイルでこれを定義しているうちにそれを正しく得ることができない場合は、私の欠点を抱えてください。私は以下のコードを思いつくことができますが、これは正しくありません。私の質問はどうすればこの権利を作ることができるのか、これは可能ですか?SQLLDR - multpleテーブルに

OPTIONS (SKIP=1) 
LOAD DATA 

INFILE 'test1.csv' 
INFILE 'test2.csv' 
INFILE 'test2.csv' 

TRUNCATE 

INTO TABLE table1 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 


INTO TABLE table2 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

2番目の質問:これはこの最初の質問の代替です。私が最初にそれを理解することができなかったので、私がしたことは、各テーブルの負荷を複数の.ctlファイルに分割し、これらの3つすべてを.batファイルで呼び出すことでした。これは少なくとも動作しますが、私の質問は、以下のようにユーザー/パスワードを3回も言及せずに、これらの3つの.ctlファイルをすべてセッションで処理する方法があるのでしょうか?

sqlldr userid=user/[email protected] control=test1.ctl 
sqlldr userid=user/[email protected] control=test2.ctl 
sqlldr userid=user/[email protected] control=test3.ctl 
+0

データが移動するテーブルをキー入力するために使用できるインジケータフィールドがデータ内に既に存在するか、または追加できましたか? –

+0

データを区別するためのキーとしてカラムを使用していませんが、キーを追加して試すことができます。 – Chito

答えて

0

複数INFILE satementsを使用して、このような何かを行うことができ、ファイルのデータが意図されていることをどのテーブル、示すことができます使用できるフィールドがある場合。 (SQLLDRがそれを無視するように、フィラーとして、それを定義する)のは、最初のフィールドは、その指標であり、それがロードされないとしましょう:だから論理的に

... 
INTO TABLE table1 
WHEN (01) = 'TBL1' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 

INTO TABLE table2 
WHEN (01) = 'TBL2' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
WHEN (01) = 'TBL3' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

、それぞれのテーブルにセクションでは、各ファイルを処理するとき。柔軟ではないし、維持することも間違いないだろう。メンテナンスを容易にするために、各ファイルの制御ファイルを用意したいだけかもしれません。すべてのファイルとテーブルが同じレイアウトであれば、読み込みを容易にするためにそれらをすべて同じステージングテーブル(インジケータ付き)にロードしてから、その後に別々のテーブルにプログラマチックに分割することもできます。その方法の長所は、プロセスの別のテーブル部分への分割をより迅速かつ容易にロードし、より多くの制御を可能にします。ちょっとしたアイデア。私はそれぞれの方法を行ってきましたが、要件とあなたが何を変えることができるかによって異なります。

+0

私はあなたが言っていることを得ました。おそらくそれらをすべて別々に保つのが最良です。 – Chito

+0

2番目の質問に戻ると、上記の例以外の複数の.ctlファイルを追加する方法はありますか? – Chito

+0

'sqlldr'に与えることができるコマンドライン引数の1つは、ユーザID情報を含むことができるパラメータファイルです。しかし、それはそれ自身のセキュリティ問題が付属しています。詳細はこちらを参照してください。http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_params.htm#i1005781それ以外の場合は、プログラムで、 'sqlldr'を呼び出す方法を思いついて、毎回異なるパラメータを渡す必要があると思います。これが私たちの行うことです。各ファイルのロード設定を保持したテーブルがあり、スケジューラがそれを読み込み、コマンドラインをビルドして実行します。 –

関連する問題