Tabelas Oracle externo: Avançado Plano de layout do arquivo
-
23-08-2019 - |
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?
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