Foreign Data Wrappers implementam a especificação SQL/MED de 2003, para manipulação de dados externos.
Surgiram no PostgreSQL 9.1 ainda como somente-leitura. No PostgreSQL 9.3 essa extensão pode ser leitura e escrita, dependendo da maturidade do plugin utilizado.
https://wiki.postgresql.org/wiki/Foreign_data_wrappers
Neste exemplo nós vamos utilizar o file_fdw para ler um arquivo CSV, e associá-lo como uma tabela no banco:
#psql -U postgres teste
#create extension file_fdw;
#create server arquivos foreign data wrapper file_fdw;
#create foreign table empregado_csv (
# id integer,
# nome varchar(4000),
# data_contrato varchar(20),
# data_demissao varchar(20)
# ) server arquivos options (format 'csv', filename '/tmp/empregado.csv', delimiter ';', header 'true');
-No exemplo, eu instalei a extensão file_fdw com o comando create extension. É necessário apenas uma vez por banco de dados criado.
-O comando create server cria um servidor. No caso é para ler arquivos CSV,.
-O comando create foreign table cria uma tabela, em que a estrutura deve estar com a do arquivo CSV. No final eu indico o server e as opções de CSV, inclusive o caminho do arquivo. Existem mais opções para o CSV, consulte a documentação do PostgreSQL.
select * from empregado_csv limit 100;
O comando vai abrir o arquivo CSV nas primeiras 100 linhas.
No próximo exemplo, vamos instalar o Oracle Client, o plugin do Oracle e abrir uma tabela de um servidor Oracle no PostgreSQL!!
1-) Instale o Oracle Client, se já não estiver instalado.
2-) Baixe o fonte do oracle_fdw no site https://wiki.postgresql.org/wiki/Foreign_data_wrappers.
3-) Descompacte e make NO_PGXS=1&&make install.
#psql -U postgres teste
#create extension oracle_fdw;
#CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw
OPTIONS (dbserver '//dbserver.mydomain.com/ORADB');
# GRANT USAGE ON FOREIGN SERVER oradb TO usuariodopg;
# CREATE USER MAPPING FOR usuariodopg SERVER oradb
OPTIONS (user 'orauser', password 'orapwd');
#CREATE FOREIGN TABLE oratab (
id integer OPTIONS (key 'true') NOT NULL,
#text character varying(30),
#floating double precision NOT NULL
#) SERVER oradb OPTIONS (schema 'ORAUSER', table 'ORATAB');
-Observe que isso se parece um pouco com o file_fdw, mas deve informar o SID do servidor Oracle no comando create server , e o usuário e senha no comando create user mapping.
-Se você não especificar a chave primária da tabela com OPTIONS (key 'true') não vai poder atualizar registros.
Outra coisa é que é possível copiar uma tabela externa para uma real com o comando create table as:
# create table pgtab as (select * from oratab);