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: oraserverUsuário do Banco: sysSenha: 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
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
[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
[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
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)
)
)
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;
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;
Comentários