Criando um Database Link entre o Oracle e o PostgreSQL

Para realizar a importação dos dados do sistema anterior do cliente (em PostgreSQL) para o novo (em Oracle) optei pela alternativa de criar um Link entre um e outro através dos Serviços Heterogêneos do Oracle (Heterogeneous Services). Assim eu poderia fazer consultas diretas na base, inclusive fazendo joins entre as tabelas do Oracle e as do Postgres. Para isso precisei fazer o seguinte:
Dados do Servidor Oracle:
Nome da Máquina: oraserver 
Usuário do Banco: sys
Senha: oracle
Dados do Servidor PostgreSQL: 
Nome da Máquina: pgserver:5432
usuario postgres
senha: postgres

Pacotes adicionais instalados: 
yum install unixODBC
yum install postgresql-odbc

Configuração do arquivo /etc/odbc.ini
[DB_PGSQL]
Description = DB_PGSQL
Driver = PostgreSQL
Trace = No
TraceFil = /tmp/odbc.log
Database = sistema
Servername = pgserver
Username = postgres
Password = postgres
Port = 5432
ReadOnly = Yes

Configuração do arquivo /etc/odbcinst.ini  
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/libodbcpsql.so
Setup = /usr/lib/libodbcpsqlS.so
FileUsage = 1

Configuração do arquivo $ORACLE_HOME/hs/admin/initDB_PGSQL.ora 
HS_FDS_CONNECT_INFO = DB_PGSQL
HS_FDS_TRACE_LEVEL = off
HS_FDS_SHAREABLE_NAME = /usr/lib/libodbc.so
#
# ODBC specific environment variables
#
set ODBCINI= /etc/odbc.ini

Configuração do arquivo $ORACLE_HOME/network/admin/listener.ora:
 SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = DB_PGSQL)
      (ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)
      (PROGRAM = hsodbc)
    )
  )

Configuração do arquivo $ORACLE_HOME/network/admin/ tnsnames.ora:
DB_PGSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = pgserver)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DB_PGSQL)
)
(HS = OK)
)

Criação do Database Link:
SQL> create public database link "DBPG_LNK" connect to "postgres" identified by "postgres" using 'DB_PGSQL';

Obs.: 

  - Os campos e nomes de tabela da base PostgresSQL precisam ser referenciados entre aspas respeitando maiúsculas/minúsculas.
  - A configuração do tnsnames.ora é necessária somente no Servidor. 
  - Esta feature do Oracle está disponível no Oracle-XE, mas não no Oracle Standard, somente para o Oracle Enterprise.

Exemplo de uso:
  
select *
   from dual @DBPG_LNK;
Postar um comentário

Postagens mais visitadas deste blog

[Kettle] - Ajuste de problema com horário de verão

[eXo] - Remover janela de solicitação de Registro

Pegando informações de Sessão no Oracle e equivalente no MSSQL