2009-05-22 9 views
3

Oracleデータベースに外部表を作成し、サーバー上のフラット・ファイルからそのデータを取り出したいとします。このファイルの形式は自明ではありません。このファイルの各行は、行の接頭辞(接頭辞自体は常に固定長です)に応じて、いくつかの異なるレイアウトの1つになります。たとえば、'TYPE1'で始まる行は、'TYPE2'で始まる行とは異なるレイアウトになります。Oracle外部テーブル:高度なフラット・ファイル・レイアウト

私は、外部テーブルがSQL ローダーのコントロールファイルで利用できるすべての構造を利用できることを読んだことがあります。しかし、私はすべての行が共通のレイアウトを共有する簡単なフラットファイルレイアウトに対処するために縫い目だけを読みました。 SQL Loader制御ファイルは簡単にWHEN句を使用してこのシナリオを扱うことができる:

WHEN (1:5) = 'TYPE1' 
(
    field1 POSITION(10:18), 
    field2 POSITION(26:35) 
) 
WHEN (1:5) = 'TYPE2' 
(
    field1 POSITION(23:27), 
    field2 POSITION(15:19) 
) 

は、どのように私は、Oracleの外部表の定義の構文を使用して、このようなレイアウトを表現することができますか?

答えて

1

これは9.2ドキュメントですが、LOAD WHEN句が必要です。

http://download.oracle.com/docs/cd/B10500_01/server.920/a96652/ch12.htm

+0

ありがとうリンク、それは非常に便利です! :)しかし、そのドキュメントによると、LOAD WHEN句は、いくつかのフィールドレイアウトのいずれかを選択するために使用されません。 "LOAD WHEN condition_spec句は、データベースに渡す必要があるレコードを識別するために使用されます。 「 エクスポートするレコードを選択するのではなく、異なるフィールドレイアウトの中からこの節を選択する例がありますか? –

+0

あなたは複数の外部テーブルで終わるつもりです。 TYPE1レコード用のテーブルとTYPE2レコード用のテーブル。あなたがそれについて考えるなら、テーブルは複数のレイアウトを持つことができません。 – David

+0

私はそのルートに行かなければならないかと思っていました。私はテーブルが複数のレイアウトを持つことができないことを理解しています。しかし、私の場合は、すべての線種が異なるフィールドで同じフィールドを指定します。ヒントをありがとう! :)あなたの最新のコメントを含めるためにあなたの答えを編集しますか? –

0

あなたは、固定レコードがこの

create table EXT_TABLE 
(
    record_type  char(2), 
    customer_id  char(10), 
    customer_name  char(60), 
    item_id   char(12) 
    quantity   char(10) 
) 
organization external 
(
    type ORACLE_LOADER 
    default directory DIR_FLUX_DEV 
    access parameters 
    (
    RECORDS DELIMITED BY NEWLINE 
    BADFILE 'ext_table.bad' 
    LOGFILE 'ext_table.log' 
    SKIP 0 
    FIELDS 
    (
    TP_REC    position(1:2) char(2), 
    customer_id   position(3:10) char(10), 
    customer_name  position(13:60) char(60), 
    item_id    position(3:12) char(12), 
    quantity    position(15:10) char(10) 
    ) 
) 
    location (DIR_FLUX_DEV:'file.txt') 
) 
reject limit 0; 

を試してみるなら、あなたは、レコード型 宣言 カーソルc1に応じて、その後に列にアクセスすることができます

select e.* from ext_table; 

begin 
    for r in c1 loop 
    if r.tp_rec = '02' then 
     dbms_output.put_line(r.tp_rec || ' ' || r.customer_id); 
    elsif r.tp_rec = '03' then 
     dbms_output.put_line(r.tp_rec || ' ' || r.item_id); 
    end if; 
    end loop; 
end; 

希望これです助けてください

関連する問題