domingo, 30 de enero de 2011

Servicios Heterogeneos

El mecanismo para conectar una fuente de datos oracle con una fuente de datos no oracle, como por ejemplo MSQLServer, MSAccess, mysql, ha sido denominado por Oracle como Servicios heterogéneos de conectividad o Heterogeneus Services (en Inglés), y que básicamente se puede entender como una conexion a otras fuentes de datos a través de los enlaces llamados database links.
Entre los objetivos más importantes de los servicios heterogéneos se encuentran:
- Usar el SQL de oracle para accesar datos de otras fuentes no oracle, como si estuvieran en el servidor Oracle.
- Hacer llamadas a otros servicios, APIS, fuentes de datos de manera transparente desde su ambiente distribuído.
Configurar dicha conexión es una tarea muy sencilla, solo basta tener instalados los respectivos drivers y modificar algunos archivos del servidor Oracle. Veamos cómo crear una conexión con una base de datos MSAccess a través de un ODBC
1. Configurar el ODBC. (supongo que esto ya lo sabes hacer, entonces no me extenderé en eso). Asumamos que el nombre al la conexión ODBC se llama extbd, nombre que usaremos de ahora en adelante.
2. Ahora bien, creamos un archivo que se llamará init.ora, es decir, para nuestro caso nuestra bd remota la vamos a llamar extbd, por lo cual el nuestro archivo se llamará initextbd.ora y lo guardamos en el directorio ORACLE_HOME\hs\admin, donde ORACLE_HOME es el directorio de instalación de Oracle en la máquina, en mi caso es C:\oracle\ora10g\10.1.0\Db_1
Bien, dentro de este archivo vamos a configurar el valor para el parámetro HS_FDS_CONNECT_INFO asignándole el nombre del odbc que fué creado . Para nuestro ejemplo sería:

-------------------------------------------------------------
# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = extbd
HS_FDS_TRACE_LEVEL = OFF
#
# Environment variables required for the non-Oracle system
#
#set =
--------------------------------------------------------------

3. El siguiente paso consiste en modificar el archivo listener.ora del servidor Oracle, agregando algunas entradas:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\ora10g\10.1.0\Db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = extbd)
(ORACLE_HOME = C:\oracle\ora10g\10.1.0\Db_1)
(PROGRAM = hsodbc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1524))
)
)
)
Reiniciar el listener. Para ello, atraves de la consola del Sistema operativo
Lsnrctl stop
Lsnrctl start
4. Agregar la entrada para la fuente de datos no Oracle en el archivo tnsnames.ora
extbd =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1524))
(CONNECT_DATA=(SID=extbd))
(HS=OK)
)
donde,
HS=OK indica que se usarán servicios heterogéneos
5. Crear el enlace database link desde oracle referenciando el servicio heterogéneo:
Create public database link ext.world connect to admin identified by admin using 'extbd';
Listo, ahora puedes verificar la connexion a la bd externa lanzando una query
SELECT * from latabladelafuenteexterna@ext.world;
__________________________________________________________________________________
"Te quiero. Te quise desde el primer momento en que te vi. Te quise incluso antes de verte por primera vez."
Un lugar en el Sol

2 comentarios:

  1. Hola, antes que nada, gracias por compartir este articulo. Te cuento a ver si me podes ayudar, hace una semana estoy peleandome con este servicio "HS", tratando de conectar un Oracle 11g instalado en un ubuntu server con un MS-Sqlserver y me tira un ora-02063 line precediendo a DBLINK_SQL. segui los pasos tal cual, con las diferencias del S.O., el odbc me anda perfecto, y ya no se que probar.
    Te paso los archivos como me quedaron para ver si me podes dar una mano.

    LISTENER.ORA
    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.95)(PORT = 1521))
    )
    )

    ADR_BASE_LISTENER = /u01/app/oracle

    SID_LIST_LISTENER=
    (SID_LIST=
    (SID_DESC=
    (SID_NAME=extdb)
    (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
    (PROGRAM=dg4odbc)

    TNSNAMES.ORA
    extdb=
    (DESCRIPTION=
    (ADDRESS=
    (PROTOCOL=TCP)
    (HOST=)
    (PORT=1521)
    )
    (CONNECT_DATA=
    (SERVER = DEDICATED)
    (SERVICE_NAME=extdb))
    (HS=OK))

    SQLNET.ORA
    SQLNET.AUTHENTICATION_SERVICE=(ALL)
    NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT,HOSTNAME)


    Gracias!!!

    ResponderEliminar
  2. Hola quisiera saber si estos dblink me permitirían ejecutar un procedimiento almacena que se encuentra en sqlserver desde una base Oracle y como debería ser la sentencia

    ResponderEliminar