Oracle Externe Tabellen: Erweiterte Flat File-Layout
-
23-08-2019 - |
Frage
Ich mag eine externe Tabelle in einer Oracle-Datenbank erstellen, seine Daten aus einer flachen Datei auf dem Server abgerufen werden. Das Format dieser Datei ist nicht trivial. Jede Zeile in dieser Datei kann eine von mehreren verschiedenen Layouts, je nach der Linie des Präfix (das Präfix selbst ist immer eine feste Länge). Zum Beispiel kann eine Linie mit 'TYPE1'
beginnen würde ein anderes Layout als eine Linie mit 'TYPE2'
beginnen.
Ich habe gelesen, dass externe Tabellen Vorteil aller Konstrukte zur Verfügung gestellt, um SQL Loader der Steuerdateien erfolgen können. jede Dokumentation I Nähte gelesen haben jedoch nur mit trivialen Flat-File-Layouts zu behandeln, wobei alle Linien ein gemeinsames Layout teilen. Eine SQL Loader-Steuerdatei leicht dieses Szenario mit der WHEN
Klausel umgehen kann:
WHEN (1:5) = 'TYPE1'
(
field1 POSITION(10:18),
field2 POSITION(26:35)
)
WHEN (1:5) = 'TYPE2'
(
field1 POSITION(23:27),
field2 POSITION(15:19)
)
Wie kann ich ein solches Layout mit Oracle externen Tabellendefinition Syntax ausdrücken?
Lösung
Dies ist von 9.2 docs aber Sie müssen die LOAD WHEN-Klausel.
http://download.oracle.com /docs/cd/B10500_01/server.920/a96652/ch12.htm
Andere Tipps
Wenn Sie haben fester Datensätze versuchen, diese
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;
Dann können Sie dann Zugriff auf Spalten je nach Datensatz-Typ erklären Cursor 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;
Hope, das hilft