Domanda

Vorrei creare una tabella esterna in un database Oracle, il recupero dei suoi dati da un file flat sul server. Il formato di questo file non è banale. Ogni riga di questo file può essere una delle varie configurazioni differenti, a seconda del prefisso della linea (il prefisso stesso è sempre una lunghezza fissa). Ad esempio, una riga che inizia con 'TYPE1' sarebbe avere un layout diverso da una linea che inizia con 'TYPE2'.

Ho letto che le tabelle esterne possono usufruire di tutti i costrutti messi a disposizione SQL file di controllo del caricatore. Tuttavia, tutta la documentazione che ho letto cuciture a che fare solo con layout flat-file banali in cui tutte le linee condividono un layout comune. A file di controllo Loader SQL potrebbe facilmente gestire questo scenario utilizzando la clausola 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)
)

Come posso esprimere un tale layout utilizzando la sintassi definizione di tabella esterna di Oracle?

È stato utile?

Soluzione

Questo è da 9.2 docs, ma è necessario il carico quando clausola.

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

Altri suggerimenti

Se avete record fissi provare questo

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;

Quindi è possibile accedere ad allora le colonne a seconda del tipo di record dichiarare   c1 cursore è

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;

Spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top