# Cómo conectar una base Oracle con otra PostgreSQL

Existen varias arquitecturas para resolver este desafío, en mi caso yo utilicé un servidor intermedio y dedicado para el Gateway:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755525544367/d33d83d2-6876-4c48-bdd8-92d519fde641.png align="center")

El primer paso es instalar el **driver ODBC**. En mi caso utilicé un servidor nuevo con el sistema operativo Oracle Linux 8 con conexión a internet:

```bash
yum install unixODBC*
```

Luego debemos instalar el **Oracle Database Gateway for ODBC**, el mismo se descarga desde aquí: [https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html](https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html)

Mientras se descarga el archivo, preparamos el servidor para la instalación del Gateway:

```bash
yum install oracle-database-preinstall-19c
mkdir /u01/app/oracle/instalador
```

Una vez descargado el instalador del gateway (LINUX.X64\_193000\_gateways.zip), lo copiamos al directorio **/u01/app/oracle/instalador** y seguimos estos pasos:

```bash
cd /u01/app/oracle/instalador
unzip LINUX.X64_193000_gateways.zip
cd gateways
export CV_ASSUME_DISTID=OL8
./runInstaller
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526108648/912343b0-bc37-473d-ab65-ed6271c9bfb2.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526118199/60df1076-9de9-4d96-8257-d78d20a52549.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526124633/f42421d8-03bd-4331-9b5c-d243a9544329.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526133022/a7abcb34-76d1-45dd-af08-fb9d3d4e65a0.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526139130/c93dbe54-028b-4d84-a125-ae3ec3270aed.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526145141/4c6c8578-da0d-4955-893c-167b423c78ae.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526149405/e7412a5b-b1b0-4b97-808b-8fff45e5cc49.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526155502/706234fc-c479-437c-94d3-265c17fdb13e.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526159412/12898ccb-49c3-4948-a199-bb46e34af15e.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526164007/67f7c578-1777-45ce-b91f-8d3bdffed5bc.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526168439/9152aacc-1b1a-487a-bf80-7e49369f8f48.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526174350/bc9c040c-06f4-4aad-a104-d2b063e764a1.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526178575/ee761291-0e37-4a78-b9da-d9dec8b613e8.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526184465/d1da789f-fd26-4a38-959e-04b66de0fb99.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755526187458/86c66d10-d624-4c54-b886-3be365105a66.png align="center")

Ahora comenzamos a configurar el Gateway:

```bash
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/tghome_1
cd $ORACLE_HOME/hs/admin
vi $ORACLE_HOME/hs/admin/init<SID>.ora
#####################################################################################################
vi $ORACLE_HOME/hs/admin/initpostgresUAT.ora

# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = postgresUAT  <========= AQUI PUEDES USAR EL VALOR QUE DESEES. ESTE SERÁ TU SID
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

#
# ODBC specific environment variables
#
set ODBCINI=/etc/odbc.ini

#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>
```

Ahora agregamos el SID elegido al listener:

```bash
cd $ORACLE_HOME/network/admin
cp -p listener.ora listener.ora.bkp
vi listener.ora

SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME= postgresUAT) <== ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN EL PUNTO ANTERIOR
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/tghome_1)
         (ENVS="LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/19.0.0/tghome_1/lib")
         (PROGRAM=dg4odbc)
      )
  )
```

Reiniciamos el listener para que tome el cambio anterior:

```bash
$ORACLE_HOME/bin/lsnrctl stop
$ORACLE_HOME/bin/lsnrctl start
```

Luego instalamos el **driver PostgreSQL**:

```bash
yum install postgresql*odbc
vi /etc/odbc.ini

[postgresUAT] <============= ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN LOS PUNTOS ANTERIORES
Driver = PostgreSQL
Description = PostgreSQL ODBC Driver
Database = <database_name_postgres>
Servername = <hostname_postgres>
Username = <usuario_postgres>
Password = <contraseña_usuario_postgres>
Port = <puerto_postgres>
BOOLSASCHAR=No
UseDeclareFetch = 1
CommLog = /tmp/pgodbclink.log
Debug = 1
```

**IMPORTANTE:** El valor de la variable **Driver**, debe coincidir con el valor que aparece entre corchetes en el archivo **/etc/odbcinst.ini**

Luego probamos la conectividad desde el Gateway hacia la base PostgreSQL:

```bash
isql -v postgresUAT
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
```

Una vez que verificamos el correcto funcionamiento de la conexión, nos dirigimos al servidor de base de datos Oracle y allí agregamos al archivo **tnsnames.ora** la cadena de conexión que utilizará el dblink:

```bash
GATEWAY_POSTGRES=
   (DESCRIPTION=
      (ADDRESS=
         (PROTOCOL=TCP)
         (HOST=<hostname_gateway>)  <====== ESPECIFICAR EL NOMBRE DEL SERVIDOR DEL GATEWAY
         (PORT=1521)
      )
      (CONNECT_DATA=
         (SID= postgresUAT)) <== ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN LOS PUNTOS ANTERIORES
      (HS=OK)
   )
```

Por último nos conectamos a la base Oracle, creamos el dblink y lo probamos:

```bash
CREATE PUBLIC DATABASE LINK TEST_POSTGRES
 CONNECT TO <usuario_postgres>
 IDENTIFIED BY <contraseña_usuario_postgres>
 USING 'GATEWAY_POSTGRES';

SELECT * FROM <tabla>@TEST_POSTGRES;
```

¡Esto es todo!

Hasta el próximo post 😀

Saludos desde Buenos Aires, Argentina
