Enlaces de Base de Datos en Oracle Apex 5.0

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

Publicado por Ing. Clarisa Maman Orfali

Clarisa es Oracle ACE Director, con más de 27 años de experiencia como desarrolladora, docente, autora y consultora en Tecnologías de la Información. Clarisa es de Argentina que vive y trabaja en Irvine, California, en los Estados Unidos. Ella es autora de los primeros tres libros de Oracle APEX. También es co-fundadora del Grupo de Usuarios de Oracle de Argentina (AROUG) y se ha especializado los últimos 13 años en el desarrollo de aplicaciones web con Oracle Application Express (APEX).

Deja un comentario

A %d blogueros les gusta esto: