Oracleの外部表:高度なフラットファイルのレイアウト
-
23-08-2019 - |
質問
私は、サーバー上のフラット・ファイルからデータを取得し、Oracleデータベースに外部表を作成したいです。このファイルの形式は、非自明です。このファイルの各行は、行のプレフィックス(接頭辞自体が常に固定長である)に応じて、いくつかの異なるレイアウトのいずれかになります。例えば、'TYPE1'
で始まる行は'TYPE2'
で始まる行は異なるレイアウトを持つことになります。
私は、外部表がSQL のLoaderの制御ファイルが利用できるようにすべての構築物の利点を取ることができることを読みました。しかし、私は読んだことがあるすべてのドキュメントはすべてのラインが共通のレイアウトを共有することにより、些細なフラットファイルのレイアウトに対処するために縫い目。 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の外部表の定義の構文を使用して、このようなレイアウトを表現する方法を教えてください。
解決
これは、9.2のドキュメントからですが、WHEN句ます。
LOADを必要としますhttp://download.oracle.com /docs/cd/B10500_01/server.920/a96652/ch12.htmする
他のヒント
あなたは、固定レコードを持っている場合に
これを試します
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;
ホープ、このことができます。
所属していません StackOverflow