- Blogzote.com - https://www.blogzote.com -

Heterogeneous Services

Hace unos días me surgió la necesidad de conectar mi base de datos Oracle xe con Mysql, quería intentar procesar unos datos de una tabla Mysql para después pasarlos a otra tabla, de entrada tenia la posibilidad de hacerlo con php, ¿pero cada que necesitara procesar datos tendría que hacer una pagina php? Por eso pensé mejor en conectar Oracle con Mysql, me sería mas fácil jalar los datos de Mysql, procesarlos con PL/SQL para después depositarlos en otra tabla Mysql.

Me tope con un concepto que Oracle llama “heterogeneous services” que no es más que una vía rápida para conectarse con otras bases de datos, en este caso Mysql, aquí los pasos que seguí para lograr la conexión, es importante mencionar que esto lo logre bajo Windows:

1) Descargar el producto llamado “Mysql connector/ODBC” para Windows por supuesto e instalarlo.

2) Es necesario crear una conexión vía ODBC, la opción se llama “Orígenes de datos ODBC” esta dentro de “herramientas administrativas”, dentro existen varias opciones, es necesario crearla bajo “System DNS”, al valor de “data source name” en este caso le llame “mysqldb”, los valores servidor, usuario, password, base de datos, etc. no son mas que los usados para conectarte normalmente a Mysql, tiene una opción para probar la conexión, es preferible probar desde ahí si se logra la conexión.

3) Dentro de la estructura de archivos de Oracle ya existe una carpeta llamada “HS”, dentro de esa carpeta existen otras dos “admin” y “bin”, dentro de la carpeta admin es necesario crear un archivo init“nombre de nuestro servicio”.ora quedando: initmysqldb.ora, dentro de el deben de ir las siguientes entradas:

HS_FDS_CONNECT_INFO = mysqldb
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME = mysqldb.trc
HS_AUTOREGISTER = TRUE

4) Dentro de la estructura de archivos de Oracle ya existe otra carpeta llamada
“NETWORK”, dentro de ella existe otra llamada “admin”, dentro de la carpeta admin existen tres archivos, “listener.ora”, “sqlnet.ora” y “tnsnames.ora” ( ya muchos los conocerán, el tnsnames.ora se usa para configurar las conexiones a base de datos oracle cuando se esta usando el resolver nombres por tnsnames, dentro del “sqlnet.ora” se define como “names.directory_path = (TNSNAMES, HOSTNAME)” pero eso es harina de otro costal) dentro del archivo “listener.ora” debe de insertarse una nueva entrada (por supuesto la ruta del producto puede variar según tu instalación):

(SID_DESC =
      (SID_NAME = mysqldb)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = hsodbc)
    )

Que junto con lo que ya tenía el archivo quedaría algo como (dependiendo de tu base de datos y servicios instalados, solo añadí la primera parte del contenido de archivo, debajo de eso no se toca el contenido):

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = mysqldb)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = hsodbc)
    )
  )
(…)

5) Al archivo “tnsnames.ora” se le añade una nueva entrada:

mysqldb = 
   (DESCRIPTION=
      (ADDRESS= (PROTOCOL=tcp) 
                (HOST=localhost)
                (PORT=1521)
     )
     (CONNECT_DATA = 
         (SERVICE_NAME=mysqldb)
     )
     (HS = OK)
)

6) Bajas y subes el servicio de tu base de datos, en este caso se llama
“OracleXETNSListener”, una vez levantado entras a tu sql*plus, cuando instalas xe te crea un iconito que llama “Ejecutar línea de comandos SQL” que no es mas que sql*plus ejecutado en un ambiente MSDOS, para los que tengan otra versión de Oracle entran directo a su sql*plus y creas un Database link con el siguiente comando, observa que el usuario y password lleva comillas dobles y el using lleva comillas simples:

create database link mysqldb 
 connect to “usuario_mysql" 
 identified by “password_mysql" 
 using ‘mysqldb’;

Listo, ahora pueden accesar a su base de datos Mysql desde Oracle, simplemente deben referenciar que el objeto viene del dblink, o sea “tabla@mysqldb”

Es importante mencionar que esto lo logre estando tanto Oracle como Mysql en la misma maquina, he intentado conectarlos estando Mysql en otro host pero hasta el momento no han sido exitosas mis pruebas, ahí se los dejo de tarea.