Pergunta

Eu gostaria de criar uma tabela externa em um banco de dados Oracle, recuperar seus dados a partir de um arquivo simples no servidor. O formato deste arquivo não é trivial. Cada linha neste arquivo pode ser um dos vários layouts diferentes, dependendo do prefixo da linha (o próprio prefixo é sempre um comprimento fixo). Por exemplo, uma linha que começa com 'TYPE1' teria um layout diferente do que uma linha que começa com 'TYPE2'.

Eu li que as tabelas externas podem tirar proveito de todas as construções feitas disponível para o SQL arquivos de controle do carregador. No entanto, qualquer documentação que tenho lido apenas costuras para lidar com layouts de arquivos simples triviais em que todas as linhas de compartilhar um layout comum. A SQL arquivo de controle do carregador poderia facilmente lidar com este cenário utilizando a cláusula 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)
)

Como posso expressar a disposição tal usando a sintaxe de definição da tabela externa da Oracle?

Foi útil?

Solução

Isto é de 9,2 docs, mas você precisa a carga quando cláusula.

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

Outras dicas

registros Se você tenha fixado tentar este

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;

Em seguida, você pode acessar colunas em seguida, dependendo recorde-type declarar 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;

Espero que isso ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top