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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top