Muchas veces nos puede pasar que tenemos nuestra aplicación en una base de datos Oracle y necesitamos acceder a otra base de datos Oracle en forma remota para acceder a ciertos datos que se encuentran en la base de datos remota y poder trabajarlo en nuestra aplicación APEX de manera local. Y en otras oportunidades puede que necesitemos desde nuestra aplicación Apex acceder a datos de otra base de datos que no es Oracle.
Hoy vamos a ver dos escenarios diferentes, por un lado cómo crear un Enlace de Base de Datos en Oracle Application Express y mostrar los datos remotos de otra base de datos Oracle XE y el segundo escenario, cómo crear un Enlace de Base de Datos desde una base de datos Oracle XE a otra base de datos MySQL.
Escenario 1 – Crear Enlace de Base de Datos de Oracle XE a Oracle XE Remota
Tengo instalada en mi PC local una base de datos Oracle 11g XE con Oracle Application Express 5.0.1 (PC1)
Y por otro lado tengo una máquina virtual en Hyper-V con Windows 7 Enterprise SP1 de 32-bit y Apex 5.0 (PC2)
PC2 – Máquina Virtual
Ingresamos a una ventana de comandos CMD
C:\> sqlplus /nolog
Ingresamos las credenciales del usuario System para verificar que esquemas tenemos disponibles.
En mi caso dispongo de los siguientes esquemas:
SQL> select username from dba_users; USERNAME ------------------------------ DEMO DEMO_APEX
CURSO_APEX
APEX_050000 HR ANONYMOUS XDB FLOWS_FILES APEX_040000 CTXSYS MDSYS SYSTEM SYS APEX_PUBLIC_USER XS$NULL OUTLN
Vamos a trabajar con el esquema CURSO_APEX
Ingresamos al esquema
SQL> connect miusuario/mipassword@SID SQL> connect curso_apex/cursoapex@xe
Para conocer las tablas disponibles del usuario curso_apex
SQL> select table_name from user_tables; TABLE_NAME ------------------------------ DEPT EMP DEMO_TAGS DEMO_TAGS_TYPE_SUM DEMO_TAGS_SUM DEMO_CUSTOMERS DEMO_ORDERS DEMO_PRODUCT_INFO DEMO_ORDER_ITEMS DEMO_STATES DEMO_CONSTRAINT_LOOKUP APEX$_ACL APEX$_WS_WEBPG_SECTIONS APEX$_WS_ROWS APEX$_WS_HISTORY APEX$_WS_NOTES APEX$_WS_LINKS APEX$_WS_TAGS APEX$_WS_FILES APEX$_WS_WEBPG_SECTION_HISTORY APEX$TEAM_DEV_FILES EDU_DEPARTAMENTOS EDU_PAISES EDU_ALUMNOS EDU_PROFESORES EDU_CURSOS EDU_MATRICULAS EDU_MATRICULA_CURSOS HTMLDB_PLAN_TABLE EBA_UT_CHART_PROJECTS EBA_UT_CHART_TASKS DEMO_CALENDARIO EBA_DEMO_CAL_PROJECTS MIS_CURSOS 34 rows selected.
Vamos a usar la tabla EDU_DEPARTAMENTOS para nuestro ejemplo.
SQL> select depto_id c1, nombre c2 from edu_departamentos; ID Departamento ----- ------------------------------ 1 Sistemas Informáticos 2 Negocios 3 Diseño Gráfico 4 Arte Plástica 5 Idiomas
Para ingresar a Oracle Apex desde la PC2 ingresamos la URL http://localhost:8080/apex en el navegador.
Nota: Verificar qué puerto se utilizó cuando se realizó la instalación de Apex.
Luego ingresamos nuestras credenciales para acceder a la página de inicio de Apex.
Para crear el Enlace de Base de Datos en APEX desde la PC1, necesitamos conocer los siguientes datos de la máquina remota (PC2):
- Nombre del esquema al que queremos acceder
- La contraseña
- La IP de su máquina remota o el nombre del host
- EL puerto donde escucha la base de datos
- El SID de la base de datos
PC1 – Local
Ingresamos las credenciales de inicio de sesión para ingresar a la página de inicio de APEX.
Antes de crear el Enlace de Base de Datos necesitamos darle permisos de creación de enlace de base de datos a nuestro usuario, en mi caso mi usuario es CLARTECH.
Abrimos una ventana de CMD y abrimos el SQLPlus con las credenciales de sysdba
C:\Users\Clarisa>sqlplus /nolog SQL> connect sys as sysdba Enter password: Connected. SQL> SQL> grant create database link to clartech; Grant succeeded.
PC1 – Crear Enlace de Base de Datos en Apex
Ingresamos a la página de inicio de Apex, hacemos clic en el módulo del Taller de SQL y luego hacemos clic en el módulo Explorador de Objetos
En la esquina superior derecha hacemos clic en el signo + para crear un “Enlace de Base de Datos” (dblink) y se abre el asistente, e ingresamos los siguientes datos y hacemos clic en el botón siguiente:
Nombre del esquema al que queremos acceder: curso_apex
La contraseña: cursoapex
La IP de su máquina remota o el nombre del host: Win7Apex5
EL puerto donde escucha la base de datos: 1521
El SID de la base de datos: XE
Nota: Si el password tiene mayúsculas y minúsculas tener en cuenta de que este encerrado entre comillas dobles para que se guarde correctamente.
En la pantalla de confirmación, hacemos clic en el botón Crear Enlace de Base de Datos.
Podemos probar el Enlace de Base de Datos recién creado haciendo clic en el botón Probar y luego hacemos clic en el botón Terminar y nos muestra que el enlace funciona correctamente.
Consultar datos a base de datos remota desde el Taller SQL
Desde la PC1 ingresamos al Taller de SQL y consultamos la tabla EDU_DEPARTAMENTOS de la PC2
Select * from [esquema].[nombre_tabla]@[dblink] Select * from curso_apex.edu_departamentos@pruebadblink
Crear una vista en Oracle Apex
Desde el Explorador de Objetos en el Taller SQL creamos una vista a partir de la siguiente consulta:
select * from curso_apex.edu_departametos@pruebadblink
Crear Informe Interactivo de la Vista
Para mostrar los datos de la tabla remota utilizamos la vista recién creada y de ese modo tenemos acceso a los datos remotos.
Escenario 2 – Crear Enlace de Base de Datos desde Oracle XE a MySQL
Máquina virtual con Windows 7 Enterprise SP1 de 32-bit
Base de Datos Oracle 11g XE
Oracle Apex 5.0
Base de Datos MySQL5.6
Máquina Virtual
Abrimos una ventana de comandos CMD y realizamos las siguientes operaciones:
### Conectarse a MySQL ### C:\Users\Admin>mysql -u root -p Enter password: ********** ### Crear Base de Datos demomysql ### mysql> create database demomysql; Query OK, 1 row affected (0.00 sec) ### Llamar a la base de datos ### mysql> use demomysql Database changed ### Crear Usuario demo ### mysql> create user 'demo'@'localhost' identified by 'demo123'; Query OK, 0 rows affected (0.00 sec) ### Conceder permisos al usuario ### mysql> GRANT ALL PRIVILEGES ON *.* TO 'demo'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) ### Crear Tabla demo ### mysql> create table demo -> (indiceid int unsigned not null auto_increment primary key, -> col1 char (40) not null, -> col2 char (20) not null, -> col3 char (10) not null, -> col4 char (20) not null, -> col5 char (15) not null); Query OK, 0 rows affected (0.16 sec) ### Mostrar la Tabla demo ### mysql> show tables; +---------------------+ | Tables_in_demomysql | +---------------------+ | demo | +---------------------+ 1 row in set (0.00 sec) ### Describir la tabla demo ### mysql> describe demo; +----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+----------------+ | indiceid | int(10) unsigned | NO | PRI | NULL | auto_increment | | col1 | char(40) | NO | | NULL | | | col2 | char(20) | NO | | NULL | | | col3 | char(10) | NO | | NULL | | | col4 | char(20) | NO | | NULL | | | col5 | char(15) | NO | | NULL | | +----------+------------------+------+-----+---------+----------------+ 6 rows in set (0.03 sec) ### ingresar un registro a la tabla demo ### mysql> INSERT INTO demo -> (col1, col2, col3, col4, col5) -> VALUES -> ("dato1", "dato2", "dato3","dato4","dato5"); Query OK, 1 row affected (0.04 sec) ### Mostrar la tabla demo con datos ### mysql> select * from demo; +----------+-------+-------+-------+-------+-------+ | indiceid | col1 | col2 | col3 | col4 | col5 | +----------+-------+-------+-------+-------+-------+ | 1 | dato1 | dato2 | dato3 | dato4 | dato5 | +----------+-------+-------+-------+-------+-------+ 1 row in set (0.00 sec)
Crear ODBC para la conexión
Cada sistema operativo tiene su propia ruta de localización de los archivos.
En Windows 7 Enterprise se encuentra:
Inicio – Panel de Control
—> Sistema y Seguridad
—> Herramientas Administrativas
—> Orígenes de datos (ODBC)
Hacemos doble clic sobre Orígenes de datos (ODBC) para abrir la ventana emergente y en la ficha DNS de Sistema vamos a agregar un nuevo ODBC.
Y hacemos clic en Finish y se abre otra ventana modal para ingresar los siguientes datos de conexión:
Nombre de Enlace de Base de Datos: mysql
Conectar a Esquema: demo
Contraseña: demo123
IP o Nombre de Host Remoto: localhost
Puerto de Host Remoto: 1521
Identificado por: SID
SID o Nombre de Servicio: mysql
Hacemos clic en OK para cerrar las ventanas.
Crear archivo ODBC
Desde el explorador de archivos nos dirigimos a nuestro ORACLE_HOME
C:\oraclexe\app\oracle\product\11.2.0\server
Necesitamos crear un archivo dentro de la carpeta hs/admin, para ello hacemos una copia del archivo initdg4odbc.ora y le cambiamos el nombre a initmysql.ora ya que el nombre se define como initSID.ora.
Abrimos el archivo para editarlo
Cambiamos esto:
HS_FDS_CONNECT_INFO = <odbc data_source_name> HS_FDS_TRACE_LEVEL = <trace_level>
Por esto:
HS_FDS_CONNECT_INFO = mysql HS_FDS_TRACE_LEVEL = 0
Guardamos los cambios y cerramos el archivo.
Cambios en archivos tnsnames.ora y listener.ora
Volvemos al ORACLE_HOME
C:\oraclexe\app\oracle\product\11.2.0\server
Necesitamos realizar unos cambios en los archivos del tnsnames.ora y listener.ora
Para ello vamos a la carpeta network/ADMIN
Abrimos el listener.ora y agregamos una entrada dentro de la primera sección en SID_LIST_LISTENER
(SID_DESC = (SID_NAME = mysql) (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server) (PROGRAM = dg4odbc) )
Abrimos el archivo tnsnames.ora y agregamos lo siguiente:
MYSQL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID = mysql) ) (HS = OK) )
Como hemos hecho cambios en el listener debemos parar el servicio y reiniciarlo.
Para ello abrimos una ventana de CMD y llamamos al listener con el comando lsnrctl y luego paramos el servicio con el comando:
LSNRCTL> stop
Y lo reiniciamos con el comando:
LSNRCTL> start
Conceder permisos al usuario de Apex para crear Enlaces de Base de Datos
Desde una ventana de comandos ingresamos al SQLPlus
C:\>sqlplus /nolog SQL> connect sys as sysdba Enter password: Connected SQL> grant create database link to curso_apex; Grant succeeded. SQL>
Crear Enlaces de Base de Datos en Oracle APEX
SQL> conn curso_apex/cursoapex@xe Connected. SQL> show user USER is "CURSO_APEX" SQL> create database link mysqldblink connect to "demo" identified by "demo123" using 'mysql'; Database link created.
Ingresamos a Apex y abrimos el Taller de SQL, hacemos clic en el Explorador de Objetos y luego en Enlaces de Base de Datos y podemos ver el objeto recién creado:
Crear una Vista desde Apex de la tabla demomysql
Ingresamos al Taller de SQL e ingresamos la siguiente sentencia:
create view demo_mysql as select * from demo@mysqldblink
Creamos un Informe Clásico para mostrar los datos de la vista recién creada.
De este modo hemos podido mostrar datos que se encuentran almacenados en una tabla de la base de datos MySQL.
Conclusión
En este artículo hemos aprendido:
- A crear un dblink desde una base de datos Oracle XE a otra base de datos remota Oracle XE instalada en una máquina virtual.
- A crear un dblink desde una base de datos Oracle XE a otra base de datos MySQL.
- A crear un Origen de Datos (ODBC)
- A crear el archivo initmysql.ora
- A editar los archivos tnsnames.ora y listener.ora