Tabelas externas utilizando oracle_loader (External tables)

Ontem recebi um email com uma duvida de como inserir em uma tabela valores de um arquivo externo texto.

E um conceito que pode ser utilizado é a External Table que já vem da versão do Oracle 9i. São tabelas baseadas por um ou varios arquivos textos do sistema operacional que o Oracle Server está hospedado.

Podendo então se fazer consultas SQL nessa tabela diretamente no arquivo texto.

No caso irei utilizar o método oracle_loader.

A possibilidade de gravar um arquivo texto se limita ao CREATE TABLE AS SELECT apenas. Não é permitido fazer UPDATE, DELETE ou INSERT numa external table.

Vamos a um exemplo:

Tenho um arquivo texto separados por virgulas, um típico arquivo csv:

arquivo001.csv

1,one,first
2,two,second
3,three,third
4,four,fourth

No Oracle devo ter um directory, diretorio onde estarão os meus arquivo textos: Para LINUX

SQL> conn system/senha
SQL> create or replace directory ext_dir as '/home/oracle/arquivos';

Para WINDOWS

SQL> conn system/senha
SQL> create or replace directory ext_dir as 'c:\temp\arquivos';

O indicado após criar o directory, conceder o privilégio de leitura para o seu usuário que irá conectar ao database. No meu caso estarei conectado como rafa

SQL> conn system/senha
SQL> grant read on directory ext_dir to rafa;

E agora vamos criar a tabela baseado no arquivo com o delimitador que é o separador virgula entre os campos.

SQL> conn rafa/rafa
SQL> create table ext_table_csv (
 id Number,
 nu Varchar2(20),
 mn Varchar2(20)
)
organization external (
 type oracle_loader
 default directory ext_dir
 access parameters (
 records delimited by newline
 fields terminated by ','
 missing field values are null
 )
 location ('arquivo001.csv')
)
reject limit unlimited;

E feito isso podendo ser feito um select na ext_table_csv

select * from ext_table_csv;

SQL> select * from ext_table_csv;

 ID NU MN
---------- -------------------- --------------------
 1 one first
 2 two second
 3 three third
 4 four fourth

Também há a opção de obter os campos com valores fixos, como irei mostrar no seguinte exemplo: arquivo002.csv

100011000
200152500
300205000
400257500

Criação da tabela

SQL> create table ext_table_fixed (
 campo1 char(3),
 campo2 char(1),
 campo3 char(5)
)
organization external (
 type oracle_loader
 default directory ext_dir
 access parameters (
 records delimited by newline
 fields (
 campo1 position(1: 3) char(3),
 campo2 position(4: 1) char(1),
 campo3 position(6: 5) char(5)
 )
 )
 location ('arquivo002.csv')
)
reject limit unlimited;

Consulta ao arquivo texto a partir da tabela no oracle

SQL> select * from ext_table_fixed;

CAMPO1 CAMPO2 CAMPO3
------ ------ ------
100 0 1000
200 1 2500
300 2 5000
400 2 7500

Espero ter ajudado Fonte:  Oracle® Database Utilities 10g Release 2 (10.2)[B14215-01]

%name Tabelas externas utilizando oracle loader (External tables)

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).