jueves, 6 de agosto de 2009

oracle to postgres dblink

Para todos los casos

sid de postgres es postg


1)primero configurar el odbcinst.ini para que vea el driver de postgres

[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/libodbcpsql.so
Setup = /usr/lib/libodbcpsqlS.so
FileUsage = 1



2)configurar el ODBC.ini con la bd que tiene que leer , el nombre del servicio tiene que ir entre corchetes

   
[postg]
Driver = /usr/lib/libodbcpsql.so
Trace = No
TraceFile =
Database = pruebaBD
Servername = 192.168.63.6 //tu ip
UserName = usertest // usuario
Password = passtes //pass
Port = 5432
Protocol = 7.0
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
ShowOidColumn = No
FakeOidIndex = No
3)probar con el comando isql –v nombre driver;

en este caso isql –v postg

+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+


Para que se conecte con oracle:

1 – hay que ir al directorio /u01/app/oracle/product/10.2.0/db_1/hs/admin

crear un archivo que se llame INIT(sid).ora

por ejemplo initpostg.ora y que tenga esto

HS_FDS_CONNECT_INFO = postg
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME = postg.trc
HS_AUTOREGISTER = TRUE
HS_FDS_SHAREABLE_NAME = /usr/lib/libodbcpsql.so

set ODBCINI=/etc/odbc.ini
set client_encoding=latin1 

2 - agregar al listener.ora

(SID_DESC =
  (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
  (SID_NAME =postg)
  (PROGRAM = hsodbc)
  )

y al tnsnames.ora

postg=
( DESCRIPTION=
  (ADDRESS = (PROTOCOL = TCP)(HOST=localhost)(PORT=1521))
  (CONNECT_DATA =
  (SID = postg)
 )
 (HS=OK) //esto es porque es un servicio heterogeneo
)

después se crea un dblink pero tener en cuenta que el usuario debe ir entre comillas dobles y con minusculas

CREATE PUBLIC DATABASE LINK base
 CONNECT TO "oracle" IDENTIFIED BY "pass" USING 'postg';

Con este script de oracle podras crear las tablas en postgres ,una vez ejecutada esta consulta te devolvera todas las sentencias necesarias , solo tendras que copiar y pegas y tendras tus tablas en postgres , es simple despues voy a poner para pasar los indices.

select case

when instr(LEAD (datos, 1, 0) OVER (ORDER BY nro),'create table') > 0
then substr(datos,1,length(datos) -1) || ');'
when LEAD (datos, 1, 0) OVER (ORDER BY nro) = '0'
then substr(datos,1,length(datos) -1) || ');'
else
datos
end
from (
select nro, case when table_name <> LAG (table_name, 1, 0) OVER (ORDER BY nro)
then 'create table ' || table_name || '('
else
null
end || ' ' ||
columna datos
from (
SELECT rownum nro,
uc.table_name,


column_name
|| ' '
|| DECODE (uc.data_type, 'NUMBER', 'NUMERIC', 'VARCHAR2', 'CHAR','CLOB','text',uc.data_type)
|| ' '
|| decode(uc.data_type,'VARCHAR2','('||uc.data_length||')', null)
|| ',' columna,
LEAD (uc.table_name, 1, 0) OVER (ORDER BY uc.table_name) AS prox
FROM user_tables ut, user_tab_cols uc
WHERE ut.table_name = uc.table_name))

free counters

1 comentario:

  1. Hola que tal:

    Muy interesante tu post, soy nuevo en muchas cosas pero me podrias explicar un poco a mas a detalle como hacer la conexión entre estos dos dbms
    yo tengo:

    debian 6 --> postgresql 9.2
    win7 --> oracle xe 11g

    gracias, saludos

    ResponderEliminar