2012-02-22 7 views
1

sQLLDER(11g)を使用してテーブルにデータをロードしています。列の1つはBLOBで、別のファイルからロードする必要があります。ファイルの名前はテーブルのフィールドによって異なります。ファイルをロードするには、フルパスを連結する必要があります。ですから、ファイルのフルパスを得るためには、フォルダパス '/ oradata/val /'をID_RECOMMENDATIONフィールドと拡張子 '.dat'に連結する必要があります。たとえば、ID_RECOMMENDATIONフィールドが '1'の場合、ファイル名は '/oradata/val/1.dat'になります。私は、元のファイルを変更することはできませんので、私はこのような何か使用して、ファイルのフルパスを取得するために式を使用する:SQLLDR:lobfileの動的ロードによるフルパスとファイル名の連結

LOAD DATA 
INFILE * 
INTO TABLE t_val_recommendation append 
fields terminated by ';' 
(
    ID_RECOMMENDATION, 
    ID_PROFILE  , 
    START_DATE  date 'yyyymmdd', 
    LOBF_00001  BOUNDFILLER"trim('/oradata/val/'||:ID_RECOMMENDATION||'.dat')", 
    PARAGRAPHS  LOBFILE (LOBF_00001) TERMINATED BY EOF, 
    ASSET_ALLOCATION 
) 

をしかし、パスの連結を理解していないようですし、ファイル名。どうやってやるの?

おかげ

これは、テーブルスキーマである(意味を明確にするために編集):

ID_RECOMMENDATION NUMBER(10)     NOT NULL,    
    ID_PROFILE   VARCHAR2(10 BYTE)   NOT NULL, 
    START_DATE   DATE      NOT NULL, 
    PARAGRAPHS   SYS.XMLTYPE, 
    ASSET_ALLOCATION SYS.XMLTYPE 

そして、これは、ロードする行のようになります。

1;CONSERVATIVE;20120301;<aa>This is my asset allocation</aa> 
+0

「LOBF_00001」列の読み込みをスキップしようとしているようですが、後でそれを使用したいのですか? –

+0

は正確ではありません。/oradata/valというフォルダにあるxmlファイルをロードしたいのですが、その名前はレコードのIF_RECOMMENDATIONフィールドです。パスとファイル名の両方を連結してフィールドPARAGRAPHSにロードすることができます。 –

+0

BEGINDATA行の後にCTLの1つのサンプル行を追加して、データマップのどのフィールドがわかるようにしてくださいどのデータベースの列に – Benoit

答えて

0

Iをあなたが読み込まれている既存のファイルを変更するのがどれくらい難しいのか分かりませんがこれらのファイルを修正して、正しいファイルパスを既に含むようにすることは可能ですか?あなたはおそらくJavaや他のテキスト処理言語を使用して、そのID_RECOMMENDATIONを '/ oradata/val /' & '.dat'に連結してファイルを保存し、ファイルに読み込むことは簡単です)を使用して...

LOAD DATA 
INFILE * 
INTO TABLE t_val_recommendation append 
fields terminated by ';' 
(
    ID_RECOMMENDATION, 
    ID_PROFILE  , 
    START_DATE  date 'yyyymmdd', 
    LOBF_00001  FILLER char, 
    PARAGRAPHS  LOBFILE (LOBF_00001) TERMINATED BY EOF 
) 

テキストファイルの変換を簡単に行うことができる多くの言語があります。 Java、Perl & C#は3つありますが、利用可能な他の多くのものがあります。

私は、SQLLDRで使いやすい形式でテキストファイルを設定することは、長期的には努力する価値があると思います。

+0

私はそれを知っています。同じファイルを別のサーバーにロードする必要があるため、パスを変更する必要があるため、これを行うには別の方法が必要でした。私はちょうど通常のフィールドではそういった操作をすることが可能だが、FILLERフィールドではできない理由を理解できない。それはちょっとばかげている。 –

0
LOBF_00001  BOUNDFILLER"trim('/oradata/val/'||:ID_RECOMMENDATION||'.dat')" 

これは私に間違いを思わ:

  • これはBOUNDFILLERであれば、それはt_val_recommendationあなたのテーブルにLOBF_00001という名前NO列があることを意味するが、あなたのデータ内のデータがあることctlファイルのセクションを消費し、それをLOBF_00001変数に格納し、他の式を計算するために使用することができます。これはEXPRESSIONある場合
  • は、それががあなたのテーブルt_val_recommendationLOBF_00001という名前列があることが、CTLファイルのデータセクションのNOデータがあることを意味します。
+0

質問を編集して私の質問を明確にしました。 –

関連する問題