<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mis notas de TI]]></title><description><![CDATA[Soy un especialista en la base de datos Oracle y en la plataforma de desarrollo de Oracle APEX. Aprendo sobre nuevas tecnologías y comparto mis apuntes]]></description><link>https://blog.jeanomobono.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 13:06:15 GMT</lastBuildDate><atom:link href="https://blog.jeanomobono.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Crear una aplicación APEX (Parte 1)]]></title><description><![CDATA[Vamos a ver un paso a paso de cómo crear una sencilla aplicación en APEX desde cero. Esta aplicación servirá para revisar algunos conceptos como:

Creación de objetos de base de datos desde SQL Workshop.

Creación de una aplicación básica, sin página...]]></description><link>https://blog.jeanomobono.com/crear-una-aplicacion-apex-parte-1</link><guid isPermaLink="true">https://blog.jeanomobono.com/crear-una-aplicacion-apex-parte-1</guid><category><![CDATA[Apex]]></category><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Sat, 06 Sep 2025 19:23:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1757186234582/926def27-7b78-445e-81b5-de466810b265.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vamos a ver un paso a paso de cómo crear una sencilla aplicación en APEX desde cero. Esta aplicación servirá para revisar algunos conceptos como:</p>
<ul>
<li><p>Creación de objetos de base de datos desde SQL Workshop.</p>
</li>
<li><p>Creación de una aplicación básica, sin páginas iniciales, todo desde cero.</p>
</li>
<li><p>Creación de las reglas de seguridad para autenticación y autorización.</p>
</li>
<li><p>Creación de listas de valores.</p>
</li>
<li><p>Modificación de las páginas para adecuarlas a nuestras necesidades.</p>
</li>
</ul>
<p>Voy a asumir que tienen conocimientos suficientes sobre esquemas de base de datos, claves primarias y foráneas (<code>PRIMARY KEY</code>y <code>FOREING KEY</code>). Además, pueden utilizar cualquier instancia de APEX para desarrollar este ejercicio, ya sea su computador o en la versión gratuita de <a target="_blank" href="https://oracleapex.com/ords/r/apex/quick-sign-up/request-workspace">Oracle APEX</a>.</p>
<p><strong>Importante</strong>: esta aplicación es apenas una demostración así que seguramente me tomaré algunas libertades que tal vez no haría en una aplicación para desplegar en un ambiente productivo.</p>
<h2 id="heading-requerimientos-del-usuario">Requerimientos del usuario</h2>
<p>Vamos a crear una aplicación muy básica pero que nos permitirá ver conceptos importantes en la creación de aplicaciones APEX. Crearemos una aplicación que servirá a un departamento de Gestión Humana para registrar a los empleados de la compañía. Los requerimientos que tiene la aplicación son:</p>
<ul>
<li><p>Registrar los datos básicos de los empleados: nombres, apellidos, fecha de nacimiento, estado civil, etc.</p>
</li>
<li><p>Registrar los datos de relación del empleado con la empresa: cargo, gerencia o departamento, sucursal o filial en la que trabaja, supervisor, fecha de ingreso, código del empleado asignado por RRHH.</p>
</li>
<li><p>Registrar los datos de contacto del empleado: correo electrónico, número de teléfono / extensión, dirección de la oficina o cubículo asignado.</p>
</li>
<li><p>Los usuarios de la aplicación que pertenezcan al departamento de RRHH podrán ver y modificar los datos de todos los empleados.</p>
</li>
<li><p>El resto de los usuarios podrá ver sus propios datos y los datos básicos de contacto del resto de los empleados.</p>
</li>
<li><p>La aplicación debe por ser usada tanto desde un computador como desde dispositivos móviles. Debe ser visualmente agradable y capaz de adaptarse a múltiples tamaños de pantalla.</p>
</li>
<li><p>Cada usuario ingresará con su dirección de correo electrónico y una contraseña.</p>
</li>
</ul>
<h2 id="heading-definicion-de-objetos-de-base-de-datos">Definición de objetos de base de datos</h2>
<p>El primer paso antes de comenzar a desarrollar la aplicación es la definición de los objetos de base de datos que serán el repositorio de la información. Estos objetos deben ser modelados según los requerimientos que nos han dado los usuarios. Comenzaremos definiendo los objetos de manera básica y luego los convertiremos en objetos de base de datos Oracle</p>
<p>En primer lugar, sabemos que debemos registrar los datos de los colaboradores, al menos la siguiente información:</p>
<ul>
<li><p>Nombre y apellido</p>
</li>
<li><p>Fecha de nacimiento</p>
</li>
<li><p>Estado civil (soltero, casado, unión libre, etc.)</p>
</li>
</ul>
<p>Sabemos que también hay cierta información que es exclusiva de un único empleado (código de empleado, fecha de ingreso, correo electrónico, etc.) así que lo podemos ver como una relación 1:1, podríamos agregar esos datos en el mismo objeto que usaremos para guardar los datos básicos. De esta forma, una tabla de <code>EMPLEADOS</code> podría quedar de la siguiente forma:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>NOMBRES</td><td>VARCHAR2(100)</td></tr>
<tr>
<td>APELLIDOS</td><td>VARCHAR2(100)</td></tr>
<tr>
<td>FECHA_NACIMIENTO</td><td>DATE</td></tr>
<tr>
<td>ESTADO_CIVIL</td><td>VARCHAR2(1)</td></tr>
<tr>
<td>FECHA_INGRESO</td><td>DATE</td></tr>
<tr>
<td>CORREO_ELECTRONICO</td><td>VARCHAR2(100)</td></tr>
<tr>
<td>CODIGO_EMPLEADO</td><td>VARCHAR2(10)</td></tr>
<tr>
<td>ID_DEPARTAMENTO</td><td>NUMBER</td></tr>
<tr>
<td>ID_CARGO</td><td>NUMBER</td></tr>
</tbody>
</table>
</div><p>Veamos un par de puntos con esta tabla antes de continuar:</p>
<ul>
<li><p>La columna <code>ESTADO_CIVIL</code>es de un tamaño de apenas un carácter porque solo vamos a guardar un valor que luego podremos obtener en una lista de valores (por ejemplo S para 'Soltero', C para 'Casado').</p>
</li>
<li><p>Al momento de crear la tabla debemos agregar una columna para la clave primaria, lo cual haremos usando un <code>IDENTITY COLUMN</code>.</p>
</li>
<li><p>Siguiendo la misma línea del punto anterior, es por eso que la columna <code>ID_DEPARTAMENTO</code> es un campo numérico, haremos referencia al <code>PRIMARY KEY</code>de la tabla de departamentos. Haremos lo mismo con el cargo, de esa forma nos aseguramos que todos los empleados que sean "Analistas contables" tengan el mismo nombre de cargo.</p>
</li>
</ul>
<p>Ahora veamos la tabla de departamentos, será una tabla muy simple con apenas algunas columnas:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>CODIGO_DEPARTAMENTO</td><td>VARCHAR2(10)</td></tr>
<tr>
<td>NOMBRE_DEPARTAMENTO</td><td>VARCHAR2(100)</td></tr>
</tbody>
</table>
</div><p>Sucede lo mismo con los cargos:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>CODIGO_CARGO</td><td>VARCHAR2(10)</td></tr>
<tr>
<td>NOMBRE_CARGO</td><td>VARCHAR2(100)</td></tr>
</tbody>
</table>
</div><p>Veamos ahora el caso de los números de teléfono del empleado, podríamos agregar una columna de número de teléfono en la tabla <code>EMPLEADOS</code>pero nos limitaría la cantidad de números que podríamos agregar. Un empleado puede tener muchos números de teléfono (una relación 1:N) por lo que crearemos una tabla para registrar estos números</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>ID_EMPLEADO</td><td>NUMBER</td></tr>
<tr>
<td>TIPO_TELEFONO</td><td>VARCHAR2(1)</td></tr>
<tr>
<td>NUMERO_TELEFONO</td><td>VARCHAR2(30)</td></tr>
</tbody>
</table>
</div><p>Lo mismo podría pasar con las direcciones, podríamos querer guardar la dirección de la casa del empleado y la dirección de la oficina.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>ID_EMPLEADO</td><td>NUMBER</td></tr>
<tr>
<td>TIPO_DIRECCION</td><td>VARCHAR2(1)</td></tr>
<tr>
<td>DIRECCIÓN</td><td>VARCHAR2(200)</td></tr>
</tbody>
</table>
</div><h3 id="heading-definicion-de-la-seguridad">Definición de la seguridad</h3>
<p>La seguridad de la aplicación debería ser definida desde un principio, ya que luego sería mucho más complicado implementarla. Veamos nuevamente los requerimientos relacionados con la aplicación</p>
<ul>
<li><p>Los usuarios de la aplicación que pertenezcan al departamento de RRHH podrán ver y modificar los datos de todos los empleados.</p>
</li>
<li><p>El resto de los usuarios podrá ver sus propios datos y los datos básicos de contacto del resto de los empleados.</p>
</li>
<li><p>Cada usuario ingresará con su dirección de correo electrónico y una contraseña.</p>
</li>
</ul>
<p>Para cumplir con estos requerimientos haremos uso de algunos componentes propios de APEX para manejar la seguridad: <a target="_blank" href="https://docs.oracle.com/en/database/oracle/apex/24.2/htmdb/establishing-user-identity-through-authentication.html#GUID-45C4B1CD-4231-4FE9-8B5B-C90611F5F57B">Authentication Schemes</a> y <a target="_blank" href="https://docs.oracle.com/en/database/oracle/apex/24.2/htmdb/providing-security-through-authorization.html#GUID-8FBF5F46-0541-4859-8470-D10E333DD271">Authorization Schemes</a>.</p>
<p>Hay varias formas de resolver el requerimiento relacionado a la autorización:</p>
<ul>
<li><p>Usar la funcionalidad nativa de APEX para el control de acceso, es la más sencilla pero he encontrado un par de debilidades:</p>
<ul>
<li><p>Es poco flexible, en caso de ser necesario agregar un nuevo rol o asignar un usuario a un rol debe hacerse desde APEX directamente, no lo podría hacer un usuario de la aplicación.</p>
</li>
<li><p>Al exportar una aplicación e importarla en otro workspace, los usuarios que están dentro de los roles no son importados, por lo que es necesario agregarlos nuevamente de manera manual.</p>
</li>
</ul>
</li>
<li><p>Crear tablas para el manejo de los roles, este enfoque permite que la seguridad pueda ser administrada desde la misma aplicación por los usuarios finales, y es fácil de replicar entre ambientes.</p>
</li>
</ul>
<p>Para este caso vamos a usar la segunda opción y veremos cómo aun es posible construir la seguridad de manera declarativa.</p>
<p>Primero definimos una tabla donde guardaremos los nombres de los roles</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>CODIGO_ROL</td><td>VARCHAR2(10)</td></tr>
<tr>
<td>DESCRIPCION_ROL</td><td>VARCHAR2(100)</td></tr>
</tbody>
</table>
</div><p>Un empleado puede tener múltiples roles, por lo que crearemos una segunda tabla con dicha relación.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Nombre columna</td><td>Tipo de dato</td></tr>
</thead>
<tbody>
<tr>
<td>ID_EMPLEADO</td><td>NUMBER</td></tr>
<tr>
<td>ID_ROL</td><td>NUMBER</td></tr>
</tbody>
</table>
</div><p>Ahora que ya hemos definido los objetos que vamos a necesitar, podemos crearlos en la base de datos. Para hacerlo más interesante, veamos cómo crearlos usando <a target="_blank" href="https://docs.oracle.com/en/database/oracle/apex/23.2/aeutl/getting-started-with-quick-sql.html">Quick SQL</a>, una funcionalidad de SQL Workshop.</p>
<p>Para ingresar a Quick SQL ingresamos a APEX - SQL Workshop - Utilities</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757185804184/7ad541a1-5970-47fc-b976-86ec173047df.png" alt class="image--center mx-auto" /></p>
<p>Con Quick SQL escribimos en texto plano los nombres de las tablas y las columnas y automáticamente se generará el código SQL necesario para crear dichos objetos.</p>
<p>Comencemos con la tabla departamentos:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757185846111/487ba120-ec7b-4c5b-94f4-f7a848b7b488.gif" alt class="image--center mx-auto" /></p>
<p>Solo fue necesario ingresar el nombre de la tabla y los campos en las líneas siguientes con un par de espacios y Quick SQL generó todo el DDL de manera automática, incluyendo la columna de <code>primary key</code>que no coloqué en el texto original.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757185890852/faf0fa00-5cf4-4aee-ae39-cc901d8ff265.png" alt class="image--center mx-auto" /></p>
<p>Sobre los modificadores que utilicé:</p>
<ul>
<li><p><code>/auditcols</code>permite agregar columnas de auditoría a la tabla (cuándo fue creado el registro, por quién, cuándo fue modificado) y los triggers necesarios para llenar dichos campos de manera automática</p>
</li>
<li><p><code>/unique</code>permite agregar un constraint <code>unique</code>sobre las columnas de la tabla, en este caso el código del departamento.</p>
</li>
</ul>
<p>Agregaremos la tabla de cargos y la tabla de empleados y le indicaremos a Quick SQL que existe una relación entre todas ellas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757185928623/e85eef44-9285-45a6-8563-336af40ac166.png" alt class="image--center mx-auto" /></p>
<p>De manera automática se crean los <code>foreing key</code>necesarios en la tabla empleados, así como los índices sobre dichas columnas (utilizando el modificado <code>/fk</code>)</p>
<p>Completemos la tarea con el resto de las tablas que definimos en el análisis del requerimiento. Una vez que estemos satisfechos con el resultado (que siempre podremos modificar según nuestras necesidades) hacemos clic en <strong>Review and Run</strong>, esto nos llevará al <strong>Script Editor</strong> y allí podremos hacer las modificaciones que necesitemos, finalmente hacemos clic en <strong>Run</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757185969532/16fa962c-da82-4b94-b075-d3db1e944a7c.png" alt class="image--center mx-auto" /></p>
<p>Es este caso vemos que todas las sentencias se ejecutaron correctamente.</p>
<p>En la siguiente parte crearemos la aplicación y definiremos el esquema de seguridad.</p>
]]></content:encoded></item><item><title><![CDATA[Agregar fuentes REST en Oracle APEX]]></title><description><![CDATA[En una publicación pasada les mostraba como crear endpoints en la base de datos utilizando Oracle REST Data Services (ORDS), los cuales luego pueden ser usados en una aplicación APEX o consumidos desde cualquier aplicación que sea capaz de hacer peti...]]></description><link>https://blog.jeanomobono.com/agregar-fuentes-rest-en-oracle-apex</link><guid isPermaLink="true">https://blog.jeanomobono.com/agregar-fuentes-rest-en-oracle-apex</guid><category><![CDATA[#oracle-apex]]></category><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Mon, 25 Nov 2024 14:16:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543019019/4b2bea16-6256-427a-9eff-96947871cce3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En una <a target="_blank" href="https://hashnode.com/post/clo3upfod000109mo5etv7s0s">publicación pasada</a> les mostraba como crear <em>endpoints</em> en la base de datos utilizando <strong>Oracle REST Data Services</strong> (ORDS), los cuales luego pueden ser usados en una aplicación APEX o consumidos desde cualquier aplicación que sea capaz de hacer peticiones REST. En esa oportunidad el origen de los datos era la misma base de datos ¿y si queremos consumir datos de una fuente REST que no sea nuestra base de datos? Hagamos un ejemplo extrayendo los datos de una API que está disponible de manera pública: <a target="_blank" href="https://gadhagod.github.io/Hyrule-Compendium-API/#/">Hyrule Compendium API</a>; la cual tiene información sobre uno de mis juegos favoritos: <strong>The Legend of Zelda: Breath of the Wild</strong>.</p>
<h2 id="heading-analizando-la-api">Analizando la API</h2>
<p>La primera tarea antes de hacer cualquier cosa en APEX es entender cómo la API nos devuelve la información que vamos a necesitar. Al revisar la documentación en su sitio web vemos que la API tiene de hecho dos componentes:</p>
<ul>
<li><p><em>Compendium API</em>: Sirve la información sobre criaturas, equipos, materiales, monstruos y tesoros.</p>
</li>
<li><p><em>Regions API</em>: Provee información sobre las ocho regiones geográficas de Hyrule. El <em>Compendium API</em> tiene varios <em>endpoints</em> que devuelven diferentes tipos de datos. Veamos un par de ellos: <strong>Get all entries</strong> y <strong>Get Categories</strong>. Comencemos con <strong>Get all entries</strong> que parece ser el más sencillo dado que no utiliza ningún tipo de parámetro.</p>
</li>
</ul>
<h3 id="heading-get-all-entries">Get All Entries</h3>
<p>El <em>endpoint</em> vendría siendo: <code>/compendium/all</code> y la forma de hacer la petición al API sería:</p>
<pre><code class="lang-http"><span class="hljs-attribute">GET https://botw-compendium.herokuapp.com/api/v3/compendium/all</span>
</code></pre>
<p>Hagamos una petición al <em>endpoint</em> para ver cómo sería la respuesta. En mi caso utilicé Insomnia pero pueden utilizar cualquier cliente para hacer la petición.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731531229827/85a0f274-034d-4d19-b488-1a0f8f33161e.png" alt class="image--center mx-auto" /></p>
<p>En este extracto podemos ver que la respuesta es un JSON que tiene un arreglo con el nombre <code>data</code> que tiene a su vez los objetos con diferentes categorías.</p>
<h3 id="heading-get-categories">Get Categories</h3>
<p>Este <em>endpoint</em> permite obtener la información de los objetos del juego según su categoría, la forma de hacer la petición al API sería la siguiente:</p>
<pre><code class="lang-http"><span class="hljs-attribute">GET https://botw-compendium.herokuapp.com/api/v3/compendium/category/&lt;category&gt;</span>
</code></pre>
<p>En este caso sí necesitamos enviar un parámetro en el URL que sería la categoría sobre la cual necesitamos la información. Para hacer una petición en Insomnia utilizaremos una variable que colocaremos en el URL.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543176195/4a6d083a-8d2a-49a2-9cd6-dcc40f4e12e7.png" alt /></p>
<p>Podemos ver que en este caso la respuesta también es un objeto que tiene un arreglo identificada como <code>data</code> que contiene los datos de los materiales para la categoría solicitada.</p>
<p>Veamos ahora como crear estas fuentes de datos REST en APEX.</p>
<h2 id="heading-creando-las-fuentes-de-datos">Creando las fuentes de datos</h2>
<p>Lo primero que haremos será crear una nueva aplicación, de momento solo la crearemos con la pantalla de Inicio ya que en un principio necesitamos acceso a los <em>Shared Components</em>. Este proceso lo pueden seguir desde cualquier instancia donde tenga APEX instalado. En mi caso utilizaré la que se encuentra en <a target="_blank" href="http://apex.oracle.com">apex.oracle.com</a>.</p>
<p>Desde la página inicial de APEX haremos clic en <em>Create</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543240552/0eb4d3d6-6095-4e95-8ea0-6d7580bfdf4a.png" alt /></p>
<p>Vamos a darle un nombre a la aplicación y hacemos clic en <em>Create Application</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543279727/6a8ade27-e9c2-41c6-a355-41afcc7fbd8f.png" alt /></p>
<p>Una vez en la aplicación ingresaremos a <em>Shared Components</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543294763/4a4d184f-de41-4295-bb70-9a5d7a9bafda.png" alt /></p>
<p>Un poco más abajo, en <em>Data Sources</em> seleccionaremos <em>REST Data Sources</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543308213/dfc8e818-6c9a-41ca-8ce3-244c81fb77d3.png" alt class="image--center mx-auto" /></p>
<p>En esta sección lo que haremos será definir la forma en que APEX va a comunicarse con los servicios REST de los cuales queremos consumir la información. Luego sería posible utilizar estas fuentes para alimentar elementos como <em>Interactive Reports</em> o <em>Interactive Grids</em>.</p>
<h3 id="heading-creando-la-fuente-para-get-all">Creando la fuente para <em>Get All</em></h3>
<p>Si no tenemos alguna otra fuente de datos veremos una pantalla similar a la siguiente:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543386301/af936de0-ad3f-4abb-951d-9751021c29dd.png" alt /></p>
<p>Simplemente hagamos clic en <em>Create</em> para crear una nueva fuente de datos REST. Nos aparecerá la siguiente pantalla en la cual seleccionaremos <em>From scratch</em> (vamos a crear la fuente desde cero) y luego haremos clic en <em>Next</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543417140/19261e06-6ed8-4522-8154-2cf231eb3456.png" alt /></p>
<p>En la siguiente pantalla veremos que nos solicita información básica sobre la fuente que vamos a crear, colocaremos la siguiente información:</p>
<ul>
<li><p>REST Data Source Type: Simple HTTP</p>
</li>
<li><p>Name: Hyrule Compendium (o el nombre que ustedes quieran)</p>
</li>
<li><p>URL Endpoint: <a target="_blank" href="https://botw-compendium.herokuapp.com/api/v3/compendium">https://botw-compendium.herokuapp.com/api/v3/compendium</a> El resto de los campos podemos dejarlos en blanco, luego haremos clic en <em>Next</em></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543435544/cc9b5ae7-f3ca-4e58-a9ef-52e2c708f755.png" alt /></p>
<p>En la siguiente pantalla se nos mostrará que APEX está creando un <em>Remote Server</em> que será la base desde la que crearemos el resto de las fuentes REST. Este es un paso que solo se realiza una vez. Dejaremos los datos tal como están y haremos clic en <em>Next</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543449806/d8a05624-e364-472b-a31e-ddc19b057cd9.png" alt /></p>
<p>En la siguiente pantalla nos solicitará información sobre la paginación de la fuente, seleccionaremos <em>No Pagination</em> y haremos clic en <em>Next</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543488148/11829f5f-6b63-4560-912f-3aff3d1b884e.png" alt /></p>
<p>La siguiente pantalla nos solicitará que le indiquemos cómo se hará la autenticación con la fuente de datos, en este caso este servicio no requiere autenticación, por lo que lo dejamos tal como está y hacemos clic en <em>Advanced</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543503727/bd8d1b6d-abfc-43c8-8c08-6f238c924adf.png" alt /></p>
<p>Dado que el servicio devuelve un JSON que no está construido específicamente para ser leído por APEX, vamos a ayudarlo a entender su estructura mediante un archivo de respuesta de ejemplo. Desde la aplicación que estén utilizando para evaluar el API, exporten la respuesta luego de haber hecho la solicitud a <em>All Entries</em> y guárdenlo en un archivo de texto.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543561627/fab7784b-cbbc-441f-9f80-0de8b54faec6.png" alt class="image--center mx-auto" /></p>
<p>Volviendo a APEX, en la pantalla <em>Parameters</em> modificaremos dos opciones:</p>
<ul>
<li><p><em>Discovery Sample</em>: Allí cargaremos el archivo que exportamos en el paso anterior</p>
</li>
<li><p><em>Row Selector</em>: Le indicaremos la clave dentro del archivo que identifica a la tabla de datos. Recuerden que toda la información está en un arreglo llamado <em>data</em> que a su vez es un arreglo de objetos.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543584667/75b2b89a-70d0-4e41-81a0-fc48dfa5cfdd.png" alt /></p>
<p>Finalmente hagamos clic en <em>Discover</em> para verificar que puede leer correctamente el API.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543604943/24f052d5-d797-47cd-899e-fe33b62562b8.png" alt /></p>
<p>En este caso vemos que leyó correctamente el API y fue capaz de identificar el arreglo en el cual se guarda la información. Para finalizar hacemos clic en <em>Create REST Data Source</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543781613/bbd64ee0-633d-4d5f-9636-0ac2be17dbe4.png" alt /></p>
<p>Si hacemos clic en el nombre de la fuente podremos ver la información con la que fue creado, así como también tendremos la posibilidad de agregar otras instrucciones REST (como PUT o POST) si el API lo permitiese.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543801549/bfa70f9c-1692-4397-9527-143c0645b203.png" alt /></p>
<h3 id="heading-creando-la-fuente-para-get-category">Creando la fuente para <em>Get Category</em></h3>
<p>Vamos ahora a crear la fuente REST para <em>Get Category</em>, este es un poco diferente ya que debemos pasar un parámetro en el URL en el cual le indicamos la categoría que deseamos consultar.</p>
<p>Volvemos a la pantalla donde tenemos la lista de fuentes REST y hacemos clic en <em>Create</em> para crear uno nuevo</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543848557/442f9da5-6d04-4ee6-aff8-2f0ef51da572.png" alt /></p>
<p>En la siguiente pantalla seleccionaremos <em>From scratch</em> y luego hacemos clic en <em>Next</em> hasta llegar a la pantalla donde indicaremos el URL del servicio. Introducimos una descripción y el URL y hacemos clic en <em>Next</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543865195/22876943-9c2b-49d5-b486-a5036db2359f.png" alt /></p>
<p>Como el servidor remoto fue creado cuando registramos la primera fuente entonces APEX nos mostrará la información existente. Lo dejamos como está y hacemos clic en <em>Next</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543884557/f4544c9c-b05c-40c3-bc9e-9edd412ee27d.png" alt /></p>
<p>En la siguiente página nos solicitará la información sobre paginación, hacemos clic en <em>Next</em> sin hacer cambios.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543916722/0ad19b43-e17b-49d2-88c9-0ba90d607f8b.png" alt /></p>
<p>En la siguiente página nos solicitará información sobre el método de autenticación del servicio, lo dejamos desactivado ya que no requiere autenticación y hacemos clic en <em>Advanced</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543930530/3df27d81-c92e-43b5-82f6-cbb25f879b83.png" alt /></p>
<p>Esta solicitud es un poco diferente a la anterior ya que requiere que pasemos un parámetro en el URL el cual le indica cuál es la categoría que vamos a consultar. Así que vamos a colocar esa información en la pantalla de parámetros. Al igual que con el caso anterior, vamos a descargar un archivo de respuesta JSON de ejemplo para que APEX pueda crear fácilmente la fuente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543945673/37a0fd34-5c1d-494c-972c-2c7604a595b5.png" alt /></p>
<p>Finalmente hacemos clic en <em>Discover</em> para verificar que la fuente funciona correctamente. Si todo está bien deberíamos ver esta pantalla.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732543973343/a3e07844-19dc-4435-8e37-70f5a1552d3d.png" alt /></p>
<p>Finalmente hacemos clic en <em>Create REST Data Source</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732544003793/96f7314c-50d4-449c-b33b-2803cc59aa33.png" alt /></p>
<p>Ahora podemos utilizar estas fuentes de datos en nuestras aplicaciones en cualquier elemento que permita que la fuente de datos sea un REST Data Source, como por ejemplo un Reporte Interactivo</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732544014077/1f2261a3-4f62-4a13-bcfb-35205ad02375.png" alt /></p>
<p>Recuerden de asegurarse que están pasando los parámetros correctos y obtendrán un reporte como este:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732544024538/1185c8f9-1a09-43bc-84ae-383674e30d6a.png" alt /></p>
<p>Espero que les sea de utilidad.</p>
]]></content:encoded></item><item><title><![CDATA[Usar ORDS en APEX para acceder a los datos vía REST]]></title><description><![CDATA[Hace ya varios años que está disponible un componente de Oracle llamado Oracle REST Data Services que permite crear servicios RESTful en la base de datos, con los cuales podemos acceder a los datos sin necesidad de tener un cliente Oracle instalado e...]]></description><link>https://blog.jeanomobono.com/usar-ords-en-apex-para-acceder-a-los-datos-via-rest</link><guid isPermaLink="true">https://blog.jeanomobono.com/usar-ords-en-apex-para-acceder-a-los-datos-via-rest</guid><category><![CDATA[Oracle]]></category><category><![CDATA[#oracle-apex]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Tue, 24 Oct 2023 04:53:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1698122906154/f0793def-6f76-4c9b-8333-ec3a340feabd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hace ya varios años que está disponible un componente de Oracle llamado <a target="_blank" href="https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/"><strong>Oracle REST Data Services</strong></a> que permite crear <a target="_blank" href="https://restfulapi.net/">servicios RESTful</a> en la base de datos, con los cuales podemos acceder a los datos sin necesidad de tener un cliente Oracle instalado en el equipo, solo utilizando <a target="_blank" href="https://restfulapi.net/http-methods/">verbos HTTP</a>.</p>
<p>En este pequeño tutorial les voy a mostrar cómo configurar ORDS en una instancia APEX en Oracle Cloud Infrastructure (OCI); el proceso es similar si tienen una instancia gratuita de APEX en apex.oracle.com o si tienen su propia instalación de APEX usando ORDS.</p>
<p>Lo primero que haré será instalar una de las aplicación de ejemplo que trae APEX en su galería, en mi caso instalaré la aplicación <em>Customers</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698118121691/fe868c59-f99c-4c67-a3f6-b71b47bbe64d.png" alt class="image--center mx-auto" /></p>
<p>Una vez instalada la aplicación y luego de ingresar al menos una vez para ejecutar el proceso de configuración de la aplicación, verificaremos en <strong><em>SQL Workshop</em></strong> todas las tablas que se crearon. En mi caso le daré una mirada a la tabla <strong>EBA_CUST_PRODUCTS</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698118225030/8927a705-c1c1-4aa1-b8fc-020d126a9e70.png" alt class="image--center mx-auto" /></p>
<p>En esta demostración crearé un servicio web que me permitirá consultar la lista de productos y también haré uno que me muestra el detalle de un producto dado su número de ID.</p>
<p>Procedemos a ir al menú <strong><em>SQL Workshop</em></strong> y seleccionamos <strong><em>RESTful Services</em></strong>. La primera vez que ingresemos nos mostrará una pantalla similar a la siguiente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698118508244/a86e0cdd-076e-4f44-b556-819c249dac8e.png" alt class="image--center mx-auto" /></p>
<p>Aquí se nos indica que el esquema seleccionado no está registrado en la metadata de ORDS, simplemente debemos hacer clic en <strong><em>Register Schema with ORDS</em></strong> para continuar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698118600013/e6ba58b0-4fe3-43cf-985c-065ca57aa4c3.png" alt class="image--center mx-auto" /></p>
<p>En el cuadro que se nos presenta podemos dejar los valores por defecto ya que esto es solo una prueba, sin embargo en sus ambientes de producción:</p>
<ul>
<li><p>Oracle recomienda cambiar el nombre del alias del <em>schema</em> para disminuir la posiblidad de que un atacante pueda determinar el nombre del usuario en la base de datos.</p>
</li>
<li><p>Todas las opciones que permitan activar métodos de autorización deberían estar encendidos.</p>
</li>
</ul>
<p>Presionamos <strong><em>Save Schema Attributes</em></strong> para guardar los cambios, inmediatamente se nos mostrará una pantalla similar a la siguiente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698118974394/8579216e-4705-4432-8d3a-a2018afdbaf5.png" alt class="image--center mx-auto" /></p>
<p>El siguiente paso es crear un <a target="_blank" href="https://docs.oracle.com/en/database/oracle/apex/22.1/aeutl/about-oracle-RESTful-services-in-application-express.html#GUID-07A1A37A-7C8A-4C47-B849-7B178E74DA07"><em>module</em></a>, que no es más que un contenedor utilizado para agrupar diferentes servicios RESTful y que ademas sirve para definir la ruta base en el URL para acceder al servicio web.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698119313113/5da08689-4931-4b96-8aed-52d6dd612d3d.png" alt class="image--center mx-auto" /></p>
<p>En la imagen anterior vemos los componentes del URL para invocar el servicio web, la ruta base vendría después del alias del <em>schema</em>.</p>
<p>Procedamos entonces a ubicarnos en el árbol de la izquierda sobre la rama <em>Modules</em> y nos mostrará la siguiente pantalla.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698119234253/0a32c637-12e4-4734-96b8-0416f0c9705a.png" alt class="image--center mx-auto" /></p>
<p>Hagamos clic en el botón <strong><em>Create Module</em></strong> y nos solicitará los datos para la creación del módulo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698119459308/967a1127-9e66-4a19-b255-938043ded254.png" alt class="image--center mx-auto" /></p>
<p>En este caso llamaremos al módulo "clientes" y su ruta base también será "clientes". Dejamos el resto de los campos con sus valores por defect y presionamos el botón <strong><em>Create Module</em></strong>. Al finalizar nos mostrará una pantalla como la siguente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698119647083/406eb426-1ff1-496a-bdd9-65d5fb40b10d.png" alt class="image--center mx-auto" /></p>
<p>Ya podemos ver cómo queda el URL, pero aun faltan un par de pasos más.</p>
<p>El siguiente paso es la creación de un <a target="_blank" href="https://docs.oracle.com/en/database/oracle/apex/22.1/aeutl/about-oracle-RESTful-services-in-application-express.html#GUID-BCED781C-0DCB-4C10-96C0-BE38A7DF6BE5"><em>template</em></a>, el cual define un servicio individual que puede ser llamado. Cada uno de estos templates luego tendrá definido uno más <em>handlers</em>, que serán los que manejarán cada una de las peticiones según el verbo HTTP utilizado.</p>
<p>Un poco más abajo en la pantalla de definición del módulo encontraremos la sección para definir el <em>template.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698120167092/45f3e1f6-8dd8-4e43-b188-acff2811a43d.png" alt class="image--center mx-auto" /></p>
<p>En esta sección haremos clic en <strong><em>Create Template</em></strong> y nos mostrará una pantalla como la siguiente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698120285098/9d3178ea-732a-4bb6-b19d-e70ffd9fcaa7.png" alt class="image--center mx-auto" /></p>
<p>Dado que mi servicio web accederá a la tabla de productos entonces así llamaré al <a target="_blank" href="https://es.wikipedia.org/wiki/Identificador_de_recursos_uniforme">URI</a> del template (atención con la barra invertida al final). Terminamos la creación del <em>template</em> haciendo clic en el botón <strong><em>Create Template</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698120720814/8114d7c5-ddfe-4e15-8ca8-f95b10b8cd17.png" alt class="image--center mx-auto" /></p>
<p>Finalmente tenemos el URL completo para obtener la lista de productos, solo falta indicar la sentencia SQL que se ejecutará cuando hagamos un GET al URL, para esto crearemos un <a target="_blank" href="https://docs.oracle.com/en/database/oracle/apex/22.1/aeutl/about-oracle-RESTful-services-in-application-express.html#GUID-B47DCA33-5607-43DD-8347-ADFCB121E887"><em>handler</em></a>. Un poco más abajo en la misma pantalla encontraremos otra sección llamada <strong><em>Resource Handlers</em></strong> y haremos clic en <strong><em>Create Handler</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698120959618/e934a89b-8dc9-4a03-a42b-58819182dab0.png" alt class="image--center mx-auto" /></p>
<p>Se nos mostrará una nueva pantalla donde indicaremos las características. Dejaremos todos los campos por defecto y escribiremos la siguiente sentencia de búsqueda en la sección Source:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> EBA_CUST_PRODUCTS
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698121228629/484589ad-7f39-4794-82f6-70317568856d.png" alt class="image--center mx-auto" /></p>
<p>En este caso dejaremos la opción <em>Source Type</em> en <em>Collection Query</em>, ya que queremos devolver un conjunto de filas en formato JSON. Finalizamos presionando el botón <strong><em>Create Handler.</em></strong></p>
<p>Una vez creado el <em>handler</em>, ya podemos empezar a probar el servicio web. Podemos usar cualquier navegador o aplicaciones especializadas como Postman (lo cual es lo recomendado, ya que no podremos hacer POST con el navegador fácilmente en caso de requerirlo)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698122743065/62121395-ffa1-4542-bcc1-bca58d5495ff.png" alt class="image--center mx-auto" /></p>
<p>En este caso nos devuelve un JSON que tiene una lista llamada "items" con un objeto que representa cada fila de la tabla.</p>
<p>Vemos ahora cómo crear un <em>template</em> para obtener los datos de un solo producto, enviando el ID del producto como parte del URI.</p>
<p>Hacemos clic sobre el módulo clientes y luego hacemos clic en el botón <strong><em>Create Template</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698121989819/4238e67c-fb9b-48c1-899c-5437431c16c0.png" alt class="image--center mx-auto" /></p>
<p>En este caso el URI varía un poco, ya que agregamos una variable de acoplamiento (o <em>bind variable</em>) que será sustituida por el ID del producto. Hacemos clic en <strong><em>Create Template</em></strong> para guardar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698122110538/ea7374a0-fbe7-455c-a333-936340d1f286.png" alt class="image--center mx-auto" /></p>
<p>Vean como el URL es ligeramente diferente, agregando el ID al final (en este caso no fue necesaria la barra invertida). Ahora crearemos un handler para manejar las solicitudes GET a este URL. Más abajo en esta misma pantalla haremos clic en <strong><em>Create Handler</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698122239335/803cab41-a835-408c-b68a-d3f1a61cf8c7.png" alt class="image--center mx-auto" /></p>
<p>En este caso sí cambiaremos <em>Source Type</em> a la opción <em>Collection Query Item</em>, ya que solo recuperaremos un registro, y en la sección Source escribiremos la siguiente sentencia SQL:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> EBA_CUST_PRODUCTS <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">ID</span> = :<span class="hljs-keyword">id</span>
</code></pre>
<p>Finalizaremos presionando el botón Create Handler y procederemos a probar nuestro servicio web.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698122508508/3499c910-33ec-4b79-9e38-006715b6ad2e.png" alt class="image--center mx-auto" /></p>
<p>En este caso el servicio nos devuelve solo un objeto con todos los detalles del mismo. Por supuesto las sentencias SQL utilizadas pueden ser tan complejas como sea necesario para extraer la información necesaria, además de que es posible crear sentecias SQL que hagan UPDATE (usando PUT), INSERT (usando POST) y DELETE (usando DELETE)</p>
]]></content:encoded></item><item><title><![CDATA[Servidor Oracle DB + APEX + ORDS + JasperReports desde cero (Parte 4)]]></title><description><![CDATA[En la que sería ya la última publicación de esta serie, veamos los pasos para la instalación de JasperReports y su integración con la base de datos.
Jasper Reports Integration 2.7
Permite la integración de APEX con el motor de reportes Jasper. La ver...]]></description><link>https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-4</link><guid isPermaLink="true">https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-4</guid><category><![CDATA[Oracle]]></category><category><![CDATA[#oracle-apex]]></category><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Thu, 17 Feb 2022 22:28:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664844027413/635AjYQLn.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En la que sería ya la última publicación de esta serie, veamos los pasos para la instalación de JasperReports y su integración con la base de datos.</p>
<h2 id="heading-jasper-reports-integration-27">Jasper Reports Integration 2.7</h2>
<p>Permite la integración de APEX con el motor de reportes Jasper. La versión más reciente de JRI se encuentra <a target="_blank" href="https://github.com/daust/JasperReportsIntegration/releases">aquí</a> y las instrucciones para la instalación están <a target="_blank" href="https://github.com/daust/JasperReportsIntegration/blob/main/src/doc/github/installation-full.md">aquí</a></p>
<p>Como usuario root creamos un nuevo directorio para almacenar los binarions de las aplicacion</p>
<pre><code class="lang-bash">mkdir -p /u01/JasperReportsIntegration
chown tomcat:tomcat /u01/JasperReportsIntegration/
</code></pre>
<p>Usarmos el comando <code>tar</code> para extraer el contenido del archivo que descargamos y lo copiamos al directorio</p>
<pre><code class="lang-bash">tar xvf jri-2.7.0-jasper-6.16.0.tar
cp -R jri-2.7.0-jasper-6.16.0/* /u01/JasperReportsIntegration/
</code></pre>
<p>Agregramos al archivo <code>.bash_profile</code> del usuario tomcat</p>
<pre><code class="lang-bash"><span class="hljs-built_in">export</span> OC_JASPER_CONFIG_HOME=/u01/JasperReportsIntegration
</code></pre>
<p>Cerramos sesión del usuario tomcat, volvemos a iniciarla y reiniciamos el servicio.</p>
<p>Modificamos el archivo <code>/u01/JasperReportsIntegration/conf/application.properties</code> para indicar los parámetros de conexión a la base de datos. Buscamos la sección <code>[datasource:default]</code> y modificamos los campos necesarios</p>
<pre><code>[datasource:<span class="hljs-keyword">default</span>]
type=jdbc
name=<span class="hljs-keyword">default</span>
url=jdbc:oracle:thin:@<span class="hljs-comment">//orcl-server:1521/XEPDB1</span>
username=testing
password=Password01
</code></pre><p>Finalmente copiamos el archivo <code>/u01/JasperReportsIntegration/webapps/jri.war</code> en el directorio <code>webapps</code> de Tomcat</p>
<pre><code class="lang-bash">cp jri.war <span class="hljs-variable">$CATALINA_BASE</span>/webapps/.
</code></pre>
<p>El despliege de la aplicación debería hacerse de forma automática y a partir de este momento debería ser posible ingresar a la página de inicio en <code>http://ip-servidor:8080/jri</code></p>
<p>El siguiente paso es instalar los objetos de base de datos, este proceso se divide en dos, una parte se ejecuta con el usuario SYS y el otro con el usuario dueño de la aplicación.</p>
<p>Descomprimimos el archivo que descargamos en algún sitio que sea accesible por el usuario <code>oracle</code> e ingresamos al directorio sql. Allí ingresamos a la base de datos usando SQL*Plus</p>
<pre><code class="lang-bash">sqlplus sys@localhost:1521/XEPDB1 as sysdba
</code></pre>
<p>Ejecutamos los siguientes comandos (en este caso <em>testing</em> es el esquema de base de datos dueño de la aplicación, deberá cambiarse por el nombre de esquema correcto en producción)</p>
<pre><code>@sys_install testing
@sys_install_acl_12_and_above.sql testing orcl-server
</code></pre><p>Luego iniciamos una nueva conexión a la base de datos, esta vez con el usuario dueño de la aplicación.</p>
<pre><code>sqlplus testing@localhost:<span class="hljs-number">1521</span>/XEPDB1
</code></pre><p>Y ejecutamos</p>
<pre><code>@user_install.sql
</code></pre><p>En una próxima publicación les mostraré cómo crear reportes PDF con JasperReports y APEX</p>
]]></content:encoded></item><item><title><![CDATA[Servidor Oracle DB + APEX + ORDS + JasperReports desde cero (Parte 3)]]></title><description><![CDATA[En la publicación anterior hicimos la instalación del servidor de aplicaciones Tomcat. En esta nueva publicación avanzaremos con la instalación de la base de datos, APEX y ORDS.
Oracle XE 21c
La guía para realizar esta instalación se puede encontrar ...]]></description><link>https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-3</link><guid isPermaLink="true">https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-3</guid><category><![CDATA[Oracle]]></category><category><![CDATA[#oracle-apex]]></category><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Sat, 12 Feb 2022 15:15:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664843800449/-uUn9nSrs.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En la <a target="_blank" href="https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-2C">publicación anterior</a> hicimos la instalación del servidor de aplicaciones Tomcat. En esta nueva publicación avanzaremos con la instalación de la base de datos, APEX y ORDS.</p>
<h2 id="heading-oracle-xe-21c">Oracle XE 21c</h2>
<p>La guía para realizar esta instalación se puede encontrar <a target="_blank" href="https://docs.oracle.com/en/database/oracle/oracle-database/21/xeinl/installing-oracle-database-xe.html#GUID-46EA860A-AAC4-453F-8EEE-42CC55A4FAD5">aquí</a>. También sugiero la lectura de este <a target="_blank" href="https://oracle-base.com/articles/21c/oracle-db-21c-xe-rpm-installation-on-oracle-linux-7-and-8">artículo</a></p>
<p>La primera tarea es descargar el archivo RPM de instalación de XE desde <a target="_blank" href="https://www.oracle.com/database/technologies/xe-downloads.html">aquí</a> y colocar el archivo descargado en la carpeta <code>home</code> del usuario <code>root</code>. Allí procedemos a ejecutar el siguiente comando para realizar la instalación (este proceso se debe ejecutar como usuario root)</p>
<pre><code>dnf -y localinstall oracle-database-xe<span class="hljs-number">-21</span>c<span class="hljs-number">-1.0</span><span class="hljs-number">-1.</span>ol8.x86_64.rpm
</code></pre><p>El proceso de instalación creará de manera automática el usuario y grupos así como hará las adecuaciones necesarias a los parámetros del <em>kernel</em>.</p>
<p>Una vez terminado el proceso de instalación y continuando como el usuario root ejecutamos el siguiente comando</p>
<pre><code>/etc/init.d/oracle-xe<span class="hljs-number">-21</span>c configure
</code></pre><p>Se solicitarán las contraseñas para los usuarios <code>SYS</code>, <code>SYSTEM</code> y <code>PDBADMIN</code>. Una vez completada la instalación es posible bajar/subir la base de datos y el listener con los siguientes comandos (como root):</p>
<pre><code>/etc/init.d/oracle-xe<span class="hljs-number">-21</span>c start
/etc/init.d/oracle-xe<span class="hljs-number">-21</span>c stop
</code></pre><h2 id="heading-oracle-apex-211">Oracle APEX 21.1</h2>
<p>La guía oficial para la instalación de APEX se puede encontrar <a target="_blank" href="https://docs.oracle.com/en/database/oracle/application-express/20.1/htmig/overview.html#GUID-DB8E4B2B-1AEB-4B76-BBA3-31C5876C3F14">aquí</a> sin embargo preferimos usar la versión resumida que se encuentra <a target="_blank" href="https://oracle-base.com/articles/misc/oracle-application-express-apex-installation">aquí</a>.</p>
<p>Creamos un nuevo tablespace para almacenar los objetos de APEX</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLESPACE</span> apex <span class="hljs-keyword">DATAFILE</span> <span class="hljs-string">'/opt/oracle/oradata/XE/XEPDB1/apex01.dbf'</span> <span class="hljs-keyword">SIZE</span> <span class="hljs-number">100</span>M <span class="hljs-keyword">AUTOEXTEND</span> <span class="hljs-keyword">ON</span> <span class="hljs-keyword">NEXT</span> <span class="hljs-number">1</span>M;
</code></pre>
<p>Luego procedemos con la instalación, ingresamos al directorio en el servidor donde descargamos y descomprimimos el software de APEX. Iniciamos sesión con el usuario oracle que fue creado durante la instalación de XE.</p>
<p>Una vez allí nos conectamos a la base de datos usando SQL*Plus con el usuario SYS y ejecutamos el script de instalacion en el contenedor XEPDB1</p>
<pre><code>cd /home/oracle/apex
sqlplus sys@localhost:<span class="hljs-number">1521</span>/XEPDB1 <span class="hljs-keyword">as</span> sysdba
</code></pre><p>(en este caso tuve que usar la sintaxis Easy Connect porque tengo otra BD en el servidor y SQL*Plus trataba de conectarse a esa, en otras circunstancias debería ser tan simple como ejecutar <code>sqlplus / as sysdba</code>)</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SESSION</span> <span class="hljs-keyword">SET</span> <span class="hljs-keyword">CONTAINER</span>=XEPDB1;
@apexins.sql APEX APEX TEMP /i/
</code></pre>
<p>Una vez completada la instalación cerramos la sesión de SQL*Plus y volvemos a ingresar con SYS para ejecutar unos comandos finales. Recomiendo cerrar SQL*Plus al ejecutar cada comando y volver a ingresar, ya que cada script hace cambios en la configuración de la aplicación que podrían afectar la ejecución de los scripts.</p>
<p>Cambiar la contraseña del usuario ADMIN de APEX (la contraseña debe tener caracteres especiales o fallará la creación)</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SESSION</span> <span class="hljs-keyword">SET</span> <span class="hljs-keyword">CONTAINER</span>=XEPDB1;
@apexchpwd.sql
</code></pre>
<p>Crear los usuarios APEX_LISTENER y APEX_REST_PUBLIC_USER</p>
<pre><code>ALTER SESSION SET CONTAINER=XEPDB1;
@apex_rest_config.sql
</code></pre><h2 id="heading-ords">ORDS</h2>
<p>Para la instalación de ORDS tomaremos como base los pasos de esta <a target="_blank" href="https://oracle-base.com/articles/misc/oracle-rest-data-services-ords-installation-on-tomcat">guía</a>. Descargaremos la última versión de ORDS desde este <a target="_blank" href="https://download.oracle.com/otn_software/java/ords/ords-latest.zip">enlace</a>.</p>
<p>Antes de iniciar la instalación nos conectaremos a base de datos para asegurar que los usuarios de conexión de ORDS están desbloqueados y que conocemos sus contraseñas.</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SESSION</span> <span class="hljs-keyword">SET</span> <span class="hljs-keyword">CONTAINER</span> = XEPDB1;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">USER</span> APEX_LISTENER <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> Password01 <span class="hljs-keyword">ACCOUNT</span> <span class="hljs-keyword">UNLOCK</span>;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">USER</span> APEX_PUBLIC_USER <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> Password01 <span class="hljs-keyword">ACCOUNT</span> <span class="hljs-keyword">UNLOCK</span>;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">USER</span> APEX_REST_PUBLIC_USER <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> Password01 <span class="hljs-keyword">ACCOUNT</span> <span class="hljs-keyword">UNLOCK</span>;
</code></pre>
<p>Iniciamos sesión con el usuario tomcat y ejecutamos los siguientes comandos para crear el directorio y descomprimir el archivo que descargamos</p>
<pre><code>mkdir /u01/ords
cd /u01/ords
unzip ords-latest.zip
mkdir -p /u01/ords/conf
</code></pre><p>Crearemos un directorio para almacenar la configuración de ORDS</p>
<pre><code>mkdir -p /u01/ords/conf
</code></pre><p>Editaremos el archivo <code>/u01/ords/params/ords_params.properties</code> para indicar los parametros de la instalación</p>
<pre><code>db.hostname=orcl-server.localdomain
db.port=<span class="hljs-number">1521</span>
db.servicename=XEPDB1
db.sid=
db.username=APEX_PUBLIC_USER
db.password=Password1
migrate.apex.rest=<span class="hljs-literal">false</span>
plsql.gateway.add=<span class="hljs-literal">true</span>
rest.services.apex.add=<span class="hljs-literal">true</span>
rest.services.ords.add=<span class="hljs-literal">true</span>
schema.tablespace.default=APEX
schema.tablespace.temp=TEMP
standalone.mode=<span class="hljs-literal">false</span>
user.tablespace.default=APEX
user.tablespace.temp=TEMP
user.apex.listener.password=Password1
user.apex.restpublic.password=Password1
user.public.password=Password1
sys.user=SYS
sys.password=Password
restEnabledSql.active=<span class="hljs-literal">true</span>
feature.sdw=<span class="hljs-literal">true</span>
database.api.enabled=<span class="hljs-literal">true</span>
</code></pre><p>Indicamos la ubicación del directorio de configuración</p>
<pre><code>$JAVA_HOME/bin/java -jar ords.war configdir /u01/ords/conf/
</code></pre><p>Iniciamos el proceso de instalación:</p>
<pre><code>$JAVA_HOME/bin/java -jar ords.war
</code></pre><p>Realizamos el despliegue al servidor Tomcat</p>
<pre><code class="lang-bash">mkdir <span class="hljs-variable">$CATALINA_BASE</span>/webapps/i/
cp -R /tmp/apex/images/* <span class="hljs-variable">$CATALINA_BASE</span>/webapps/i/
<span class="hljs-built_in">cd</span> /u01/ords
cp ords.war <span class="hljs-variable">$CATALINA_BASE</span>/webapps/
</code></pre>
<p>Iniciamos el servicio Tomcat en caso que este detenido. Si todo está bien deberíamos poder ingresar a APEX en <code>http://ip-servidor:8080/ords</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664843929259/Zp3GIXfNf.png" alt="Oracle APEX - Sign In.png" /></p>
<p>En la próxima publicación culminaremos con la instalación de la integración con JasperReports.</p>
]]></content:encoded></item><item><title><![CDATA[Servidor Oracle DB + APEX + ORDS + JasperReports desde cero (Parte 2)]]></title><description><![CDATA[En la primera parte completamos la instalación de un servidor Oracle Linux 8 listo para empezar a ser configurado con el resto de los componentes. Ahora veamos la instalación de nuestro middleware que sería Apache Tomcat
Apache Tomcat 9
Tomcat será e...]]></description><link>https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-2</link><guid isPermaLink="true">https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-2</guid><category><![CDATA[Oracle]]></category><category><![CDATA[#oracle-apex]]></category><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Tue, 08 Feb 2022 20:06:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664843423642/6DXCEyu7t.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En la <a target="_blank" href="https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-1">primera parte</a> completamos la instalación de un servidor Oracle Linux 8 listo para empezar a ser configurado con el resto de los componentes. Ahora veamos la instalación de nuestro <em>middleware</em> que sería <strong>Apache Tomcat</strong></p>
<h2 id="heading-apache-tomcat-9">Apache Tomcat 9</h2>
<p>Tomcat será el servidor de aplicaciones sobre el que desplegaremos ORDS. Para la instalación de Tomcat usaremos como base los pasos indicados <a target="_blank" href="https://oracle-base.com/articles/linux/apache-tomcat-9-installation-on-linux">aquí</a></p>
<p>Debemos descargar dos componentes:</p>
<ul>
<li><a target="_blank" href="https://jdk.java.net/17/">OpenJDK 17</a></li>
<li><a target="_blank" href="https://tomcat.apache.org/download-90.cgi">Apache Tomcat 9</a></li>
</ul>
<p>Como usuario <code>root</code> crearemos el usuario <code>tomcat</code> y el directorio donde se instalará el software.</p>
<pre><code>useradd tomcat
mkdir -p /u01
chown tomcat:tomcat /u01
</code></pre><p>Instalaremos OpenJDK en el directorio <code>/u01/java</code></p>
<pre><code>su - tomcat
mkdir -p /u01/java
cd /u01/java
tar xzf openjdk<span class="hljs-number">-17</span>_linux-x64_bin.tar.gz
ln -s jdk<span class="hljs-number">-17</span> latest
</code></pre><p>Procederemos a instalar Tomcat en el directorio <code>/u01/tomcat</code></p>
<pre><code>mkdir -p /u01/tomcat
cd /u01/tomcat
tar xzf apache-tomcat<span class="hljs-number">-9.0</span><span class="hljs-number">.54</span>.tar.gz
ln -s apache-tomcat<span class="hljs-number">-9.0</span><span class="hljs-number">.54</span> latest
</code></pre><p>Siguiendo las recomendaciones del artículo, procederemos a separar los binarios de Tomcat de la configuración para que los futuros procesos de actualización sean más simples. Para esto crearemos un nuevo directorio que servirá como ubicación para <code>CATALINA_BASE</code> y en este copiaremos los archivos relevantes.</p>
<pre><code>mkdir -p /u01/config/instance
cp -r /u01/tomcat/latest/conf /u01/config/instance
cp -r /u01/tomcat/latest/logs /u01/config/instance
cp -r /u01/tomcat/latest/temp /u01/config/instance
cp -r /u01/tomcat/latest/webapps /u01/config/instance
cp -r /u01/tomcat/latest/work /u01/config/instace
</code></pre><p>Agregaremos las siguientes líneas al archivo <code>/home/tomcat/.bash_profile</code></p>
<pre><code><span class="hljs-keyword">export</span> JAVA_HOME=<span class="hljs-regexp">/u01/</span>java/latest
<span class="hljs-keyword">export</span> CATALINA_HOME=<span class="hljs-regexp">/u01/</span>tomcat/latest
<span class="hljs-keyword">export</span> CATALINA_BASE=<span class="hljs-regexp">/u01/</span>config/instance
</code></pre><p>Cerramos la sesión del usuario <code>tomcat</code> y la volvemos a iniciar para que tome los cambios en este archivo. Luego de esto ya podemos iniciar/detener Tomcat con los siguientes comandos (habiendo iniciado sesión con el usuario <code>tomcat</code>):</p>
<pre><code>$CATALINA_HOME/bin/startup.sh
$CATALINA_HOME/bin/shutdown.sh
</code></pre><p>Si todo finalizó de manera correcta podemos ingresar al portal de Tomcat en <code>http://ip-servidor:8080/</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664843665399/MRGDGREiP.png" alt="Apache Tomcat_9.0.64.png" /></p>
<p>En la próxima parte haremos la instalación de la base de datos.</p>
]]></content:encoded></item><item><title><![CDATA[Servidor Oracle DB + APEX + ORDS + JasperReports desde cero (Parte 1)]]></title><description><![CDATA[En mis publicaciones anteriores les he mostrado como hacer la instalación de una base de datos XE o de APEX usando herramientas como Vagrant o Docker, que permiten realizar el proceso con mucha facilidad. Esto está muy bien cuando quieren hacer prueb...]]></description><link>https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-1</link><guid isPermaLink="true">https://blog.jeanomobono.com/servidor-oracle-db-apex-ords-jasperreports-desde-cero-parte-1</guid><category><![CDATA[Oracle]]></category><category><![CDATA[#oracle-apex]]></category><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Mon, 07 Feb 2022 18:18:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664843142564/J7uCAdTOe.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En mis publicaciones anteriores les he mostrado como hacer la instalación de una <a target="_blank" href="https://blog.jeanomobono.com/oracle-xe-con-vagrant">base de datos XE</a> o de <a target="_blank" href="https://blog.jeanomobono.com/oracle-apex-con-vagrant">APEX</a> usando herramientas como Vagrant o Docker, que permiten realizar el proceso con mucha facilidad. Esto está muy bien cuando quieren hacer pruebas en sus máquinas locales o tienen que hacer una instalación muy rápida y pequeña. ¿Qué hacemos si necesitamos hacer la instalación en un servidor de manera directa (no virtualizado) porque las exigencias del proyecto son un poco más altas?</p>
<p>En esta serie de publicaciones les mostraré mi experiencia instalando un servidor desde cero con las siguientes características:</p>
<ul>
<li>Oracle Linux 8</li>
<li>Apache Tomcat 9</li>
<li>Oracle XE 21c</li>
<li>ORDS 21.3</li>
<li>JasperReports Integration 2.7</li>
</ul>
<p>Comencemos con la instalación del sistema operativo</p>
<h2 id="heading-oracle-linux-8">Oracle Linux 8</h2>
<p>La primera tarea es instalar el sistema operativo en el equipo. Para asegurar la máxima compatibilidad con la base de datos y el resto de los componentes procederemos a instalar Oracle Linux 8, el cual se puede descargar desde <a target="_blank" href="https://yum.oracle.com/oracle-linux-isos.html">aquí</a>. En esta página seleccionaremos la última versión disponible de <strong>Boot ISO</strong> (esta es una versión más pequeña, el resto de los paquetes se descargaran en el momento de la instalación).</p>
<p>Una vez que tengamos el archivo ISO procedemos a usar una herramienta como <a target="_blank" href="https://rufus.ie/es/">Rufus</a> (si estamos en Windows) para crear un USB <em>booteable</em>. Ingresamos el USB en el computador donde instalaremos el sistema operativo y al momento de arrancar le indicaremos al computador que haga el arranque desde el USB, esto iniciará el proceso de instalación de Oracle Linux.</p>
<p>A partir de este momento podemos seguir la <a target="_blank" href="https://docs.oracle.com/en/operating-systems/oracle-linux/8/install/ol8-install-basic.html#graphics-mode">guía de instalación</a> en modo gráfico para hacer la instalación. Hay que poner especial cuidado en la sección 3.1.3 donde se explica como configurar los repositorios desde los cuales se descargarán los paquetes del sistema operativo.</p>
<p><strong>Sobre la configuración de red</strong>: Por defecto la interface de red está deshabilitada, se debe habilitar manualmente para que pueda conectarse a los repositorios.</p>
<p><strong>Sobre la particiones del disco duro:</strong> Por defecto la instalación del sistema operativo crea un <em>filesystem</em> en <em>root</em> y un <code>/home</code> que puede ocupar todo el disco. Es importante revisar esta configuración para asegurar que <code>/home</code> no sea tan grande y que se deje suficiente espacio para <code>/opt</code> que es donde se instala XE y se crean por defecto sus archivos de datos. Aunque no es obligatorio, sugiero dejar <code>/opt</code> como un punto de montura fuera de <em>root</em> para que sea más fácil de manipular en caso de ser necesario. Por supuesto tota la instalación se debe hacer sobre LVM.</p>
<p><strong>Sobre la selección de software</strong>: Sugiero que se seleccione la opción <strong>Server</strong> (sin GUI) ya que no se requiere una interface gráfica para la instalación y administración de la base de datos.</p>
<p><strong>Sobre los usuarios iniciales</strong>: Es obligatorio asignar una contraseña al usuario root, se sugiere que sea una contraseña fuerte. Además se sugiere crear otro usuario diferente a root que tenga privilegios de administración (que pueda usar <em>sudo</em>)</p>
<h3 id="heading-tareas-posteriores-a-la-instalacion">Tareas posteriores a la instalación</h3>
<p>Es necesario hacer algunas configuraciones a nivel de red para asegurar que las conexiones se realizan de manera correcta. Para esto utilizaremos la aplicación <code>nmtui</code> conectados con el usuario root.</p>
<p>Al ingresar a la aplicación realizaremos los siguientes pasos:</p>
<ul>
<li>Seleccionar la opción <code>Edit a connection</code></li>
<li>Seleccionar la interface asociada a la tarjeta de red (por lo general eth1 o eno1)</li>
<li>En la sección <code>IPv4 Configuration</code> seleccionaremos la opción <code>Manual</code> y asignaremos una dirección IP fija dentro del rango de la red, recuerde que también debe indicar la máscara de red (por lo general es /24 en redes pequeñas), la colocaremos en el campo <code>Addresses</code></li>
<li>En el campo <code>Gateway</code> colocaremos la IP de la pueta de enlace, por lo general es la IP del modem/router dado por el proveedor de internet.</li>
<li>En el campo <code>DNS servers</code> colocaremos las direcciones IP de los servidores DNS, por lo general son asignados por el proveedor de internet. También es posible utilizar servidores DNS externos como los de Google o Cloudflare.</li>
<li>Dejamos el resto de los campos con sus valores por defecto y bajamos hasta el final de la pantalla y presionamos <code>OK</code>.</li>
<li>Presionamos el botón <code>Back</code> para volver a la pantalla inicial.</li>
<li>Seleccionamos la opción <code>Set system hostname</code>.</li>
<li>Asignamos un nombre al servidor, sugiero algo como <code>orcl-server.localdomain</code> (en caso que la red del cliente no tenga un dominio creado).</li>
<li>Presionamos el botón <code>OK</code></li>
<li>Presionamos el botón <code>Quit</code></li>
<li>Reiniciar el equipo para aplicar los cambios.</li>
</ul>
<p>En la próxima publicación veremos cómo hacer la instalación de Tomcat 9</p>
]]></content:encoded></item><item><title><![CDATA[Aplicaciones de ejemplo en Oracle APEX 21 o superior]]></title><description><![CDATA[Ya hemos visto varias formas de instalar Oracle APEX, ya sea utilizando Vagrant o haciendo uso de las plataformas de Oracle que pueden ser apex.oracle.com o la versión Always Free en Oracle Cloud. Ahora bien, si instalaron la versión 21 o superior no...]]></description><link>https://blog.jeanomobono.com/aplicaciones-de-ejemplo-en-oracle-apex-21-o-superior</link><guid isPermaLink="true">https://blog.jeanomobono.com/aplicaciones-de-ejemplo-en-oracle-apex-21-o-superior</guid><category><![CDATA[Oracle]]></category><category><![CDATA[#oracle-apex]]></category><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Sun, 06 Feb 2022 19:03:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664842574451/zRhY29Hvo.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ya hemos visto varias formas de instalar Oracle APEX, ya sea utilizando <a target="_blank" href="https://blog.jeanomobono.com/oracle-apex-con-vagrant">Vagrant</a> o haciendo uso de las plataformas de Oracle que pueden ser <a target="_blank" href="http://apex.oracle.com">apex.oracle.com</a> o la versión <a target="_blank" href="https://docs.oracle.com/en/cloud/paas/apex/gsadd/always-free-oracle-apex-application-development.html">Always Free en Oracle Cloud</a>. Ahora bien, si instalaron la versión 21 o superior notarán que la página de Galeria de aplicaciones cambió por completo y ya no trae las aplicaciones de ejemplo instaladas por defecto.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834117937/W5vBphSlb.png" alt="APEX Gallery Page" /></p>
<p>Ahora nos presenta tres opciones para descargar:</p>
<ul>
<li><em>Samples</em> (Ejemplos): Nos muestran las funcionalidades más interesantes de APEX en aplicaciones específicas para cada una.</li>
<li><em>Plug-ins:</em> Nos permiten extender la funcionalidad de Oracle APEX.</li>
<li><em>Apps</em>: Son aplicaciones completamente funcionales para diferentes tipos de casos de uso (manejo de clientes, calendarios, encuestas, etc) y que podemos personalizar según nuestras necesidades.</li>
</ul>
<p>En esta oportunidad vamos a instalar una aplicación de ejemplo, para ello haremos clic en <em>Samples</em>, lo que nos llevará a la página con el listado de aplicaciones de ejemplo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834120050/QIZcbMSbtK.png" alt="Oracle Sample Apps page" /></p>
<p>Vamos a descargar la aplicación <em>Sample Charts</em>, que nos muestra algunos ejemplos de las gráficas que es posible construir en Oracle APEX. Haciendo clic en el enlace nos llevará a la página de GitHub donde se hospeda la aplicación.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834121909/1EiFIylBC.png" alt="GitHub repository" /></p>
<p><strong>Importante</strong>: Verifiquen que están en la rama apropiada del repositorio según la versión de Oracle APEX que tengan instalada, esta la encontarán en la esquina superior izquierda sobre la lista de archivos. Para descargar la aplicación hagan clic  sobre el archivo con extensión zip y en la siguiente pantalla hagan clic en <em>Download</em> y finalmente seleccionen una carpeta en su equipo para guardar el archivo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834123486/u4xYmZozsa.png" alt="Download file from GitHub" /></p>
<p>Ya con el archivo en nuestro equipo volveremos a la página principal de APEX, en la sección <em>App Builder</em> seleccionaremos <em>Import</em> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834124911/lSt-aNmwq.png" alt="APEX App Builder Page" /></p>
<p>En la siguiente pantalla se nos pedirá que subamos el archivo de la aplicación. Podemos arrastrarla desde la carpeta o hacer clic sobre la sección <em>Drag and Drop</em> y luego seleccionar el archivo. Dejamos el resto de las opciones con sus valores por defecto y presionamos el botón <em>Next</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834126445/MRECTfRsz.png" alt="Import Page" /></p>
<p>En la siguiente pantalla se solicitará la confirmación de la tarea de importación. Hagan clic en <em>Next</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834128041/NRZFQWX3y.png" alt="Import Confirmation page" /></p>
<p>APEX les solicitará entonces la información sobre la aplicación que desean instalar, dejen los valores por defecto a menos que tengan una buena razón para cambiar alguno, y hagan clic en <em>Install Application</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834129722/-IjVUi4Bq.png" alt="APEX App information page" /></p>
<p>La siguiente pantalla les pedirá indicar si desean instalar los objetos de soporte, estos son los objetos de base de datos que tienen los datos que serán presentando por la aplicación. Mantengan las opciones por defecto y hagan clic en <em>Next</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834131365/M6DGyeJsI.png" alt="APEX install support objects page" /></p>
<p>Finalmente verán una pantalla de confirmación, hagan clic en <em>Install</em>.</p>
<p><strong>Importante</strong>: Si están haciendo uso de la versión Always Free de Oracle Cloud asegurense que el usuario de base de datos dueño del <em>workspace</em> tenga privilegios para usar el <em>tablespace</em> DATA.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834132947/gL3ULJ5wo.png" alt="APEX install support objects confirmation page" /></p>
<p>Si todo está bien se mostará una nueva pantalla donde se indica que la instalación fue exitosa. Hagan clic en <em>Run Application</em> para ejecutar la aplicación.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834134328/4Bu6Sp2CET.png" alt="APEX app succesfully installed" /></p>
<p>Posiblemente les solicite el usuario y contraseña para acceder al workspace, luego de eso podrán ver la aplicación totalmente funcional.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834135875/bAJLDwDsk.png" alt="APEX app" /></p>
<p>Pueden repetir estos pasos para instalar las otras aplicaciones de ejemplo, las mismas quedarán instaladas en su <em>workspace</em> y podrán editarlas desde el <em>App Builder</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834137339/TcXgaCg7j.png" alt="APEX App Builder" /></p>
]]></content:encoded></item><item><title><![CDATA[Oracle APEX con Vagrant]]></title><description><![CDATA[En la publicación anterior donde les explicaba como hacer la instalación de Oracle XE 18c usando Vagrant y VirtualBox, les presentaba mi opinión de por qué me parece más apropiado usar la virtualización para la creación de estos ambientes de trabajo....]]></description><link>https://blog.jeanomobono.com/oracle-apex-con-vagrant</link><guid isPermaLink="true">https://blog.jeanomobono.com/oracle-apex-con-vagrant</guid><category><![CDATA[Oracle]]></category><category><![CDATA[spanish]]></category><category><![CDATA[#oracle-apex]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Mon, 15 Feb 2021 03:29:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664841903034/iWKN5gGkk.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En la <a target="_blank" href="https://blog.jeanomobono.com/oracle-xe-con-vagrant">publicación</a> anterior donde les explicaba como hacer la instalación de Oracle XE 18c usando Vagrant y VirtualBox, les presentaba mi opinión de por qué me parece más apropiado usar la virtualización para la creación de estos ambientes de trabajo. En esta oportunidad vamos a usar la misma metodología para hacer la instalación de Oracle APEX.</p>
<h1 id="heading-oracle-application-express">Oracle Application Express</h1>
<p>O simplemente <a target="_blank" href="https://apex.oracle.com/es/">APEX</a>, es una plataforma de desarrollo de código bajo (<em>low-code</em>) desarrollada por Oracle para interactuar directamente con la base de datos, y que además permite crear aplicaciones completas en muy poco tiempo. Es una plataforma donde casi todo el desarrollo se realiza de forma declarativa (cambiando propiedades a los elementos de la aplicación) con una interface muy intuitiva, y que a su vez permite hacer personalizaciones más avanzadas ya sea mediante PL/SQL o JavaScript.</p>
<p>Hay diversas formas de empezar a trabajar con APEX:</p>
<ul>
<li>Instalación de APEX en la base de datos de tu compañía (on-premise)</li>
<li>Solicitar un espacio de trabajo gratuito en <a target="_blank" href="https://apex.oracle.com/pls/apex/f?p=4700:2:106848511761991:::RP::">apex.oracle.com</a></li>
<li>Crear una cuenta en la <a target="_blank" href="https://www.oracle.com/cloud/free/">capa gratuita</a> de Oracle Cloud</li>
<li>Instalar una VM con todo lo necesario para trabajar de manera local</li>
</ul>
<p>Cada una de estas opciones tiene sus ventajas y características. En este artículo veremos la última opción, trabajar de manera local.</p>
<h1 id="heading-preparar-los-archivos">Preparar los archivos</h1>
<p>En esta oportunidad asumiré que ya tienen instalado Virtualbox y Vagrant en sus equipos y que ya descargaron o clonaron el repositorio de los scripts preparados por Oracle. Nuevamente el ejemplo lo haremos sobre un equipo anfitrión con Ubuntu 20.04, sin embargo estas instrucciones deberían funcionar igual en otros sistemas operativos.</p>
<p>Lo primero es conseguir desde la página web de Oracle los instaladores de cada uno de los componentes (esto deben hacerlo solo una vez):</p>
<ul>
<li>Archivo rpm para la instalación de Oracle XE: <a target="_blank" href="https://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html">https://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html</a></li>
<li>Oracle APEX: <a target="_blank" href="https://www.oracle.com/tools/downloads/apex-downloads.html">https://www.oracle.com/tools/downloads/apex-downloads.html</a></li>
<li>Oracle Rest Data Services (ORDS): <a target="_blank" href="https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads.html">https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads.html</a></li>
</ul>
<p><a target="_blank" href="https://www.oracle.com/database/technologies/appdev/rest.html">ORDS</a>, por si no lo han visto antes, crea un puente entre HTTP y tu base de datos, te permite crear REST API endpoints sobre los que puedes crear solicitudes en tus aplicaciones y extraer o procesar información de la base de datos.</p>
<p>Al finalizar la descarga deben colocar todos los archivos en <code>vagrant-projects/OracleAPEX</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834142669/KfF_oV9tj.png" alt="Archivos iniciales instalación" /></p>
<p>Una vez que los archivos estén en su sitio, solo deben ejecutar el comando <code>vagrant up</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834144189/TaYanoFA7.png" alt="Iniciar el proceso con vagrant up" /></p>
<p>El proceso de instalación puede tardar un buen rato dependiendo de su conexión a internet, la capacidad del equipo, etc.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834145801/XpgTPuEF8.png" alt="Proceso de instalación" /></p>
<p>Una vez terminado el proceso de instalación, tomen nota de la información de conexión, recuerden que las contraseñas son autogeneradas pero se pueden cambiar luego de terminar el proceso.</p>
<p>Abran su navegador de preferencia y vayan a la URL indicada en el instalador, por lo general será <a target="_blank" href="http://localhost:8080/ords">http://localhost:8080/ords</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834147655/KxvtmQy6E.png" alt="Página de inicio APEX" /></p>
<p>Si todo está bien, deberían ver la página inicial de APEX en su equipo. La primera vez, dado que aun no han creado un espacio de trabajo, deben ingresar la siguiente información:</p>
<ul>
<li>Workspace: internal</li>
<li>Username: admin</li>
<li>Password: la contraseña generada por el instalador</li>
</ul>
<p>La primera vez que ingresen les pedirá que cambien la contraseña, asegúrense que sea una contraseña segura con al menos una mayúscula, números y un signo de puntuación. Una vez que hagan el cambio los llevará a la pantalla de bienvenida para crear su primer espacio de trabajo.</p>
<p>En APEX un <strong>espacio de trabajo</strong> es un compartimento lógico, una especie de base de datos privada que permite a los desarrolladores trabajar con una misma aplicación de APEX manteniendo privados sus propios objetos, datos y aplicaciones. El primer espacio de trabajo creado por defecto se llama <strong>internal</strong>, es un espacio de trabajo especial donde no se pueden crear aplicaciones ya que es el sitio de administración de APEX.</p>
<p>Pudieran crear un espacio de trabajo por usuario, o por proyecto, eso dependerá totalmente de sus necesidades.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834149401/1_9LPICp2.png" alt="Página de bienvenida a APEX" /></p>
<p>Hagan clic en <em>Create Workspace</em>, esto los llevará a la pantalla donde deben indicar los datos básicos del espacio de trabajo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834151283/82edhPHka.png" alt="Datos espacio de trabajo" /></p>
<p>En mi caso simplemente voy a crear un espacio de trabajo llamado <em>testing</em>. Presionen <em>Next</em> para continuar a la siguiente pantalla.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834152726/8vz8_ZZVh.png" alt="Datos esquema del espacio de trabajo" /></p>
<p>Un espacio de trabajo está asociado a un esquema de la base de datos. Pueden reutilizar un esquema ya existente (seleccionando <strong>Yes</strong> en <em>Re-use existing schema?</em>) o pueden crear un nuevo esquema y en esta pantalla colocaran los datos del mismo. En mi caso particular crearé un esquema con el mismo nombre del espacio de trabajo (recuerden que el nombre del esquema debe seguir las reglas de nombres de cualquier esquema/usuario que creen en la base de datos). Al introducir todos los datos presionen <em>Next</em> para continuar a la siguiente pantalla.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834154136/S4jyriP2e.png" alt="Credenciales administrador espacio de trabajo" /></p>
<p>Luego deben dar los datos del administrador del espacio de trabajo. En el campo <em>Username</em> coloquen el nombre de usuario que usaran para conectarse como administrador (por lo general es <strong>admin</strong> pero pueden poner lo que quieran), una contraseña, nombre, apellido y dirección de correo electrónico.</p>
<p>La pantalla final les mostrará un resumen de los datos que colocaron para crear el espacio de trabajo, simplemente hagan clic en <em>Create Workspace</em> para finalizar.</p>
<p>Luego de un pequeño instante les mostrará la confirmación de la creación del espacio de trabajo, junto con la información sobre las estructuras de almacenamiento del usuario recién creado.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834155362/PVDAEdFOl.png" alt="Espacio de trabajo creado" /></p>
<p>Al presionar el botón <em>Done</em> los llevará a la página de administración de los espacios de trabajo. Ya pueden cerrar esta sesión para ingresar al espacio de trabajo recién creado. Simplemente hagan clic en la parte superior derecha, donde aparece el nombre del usuario y en el menú emergente hagan clic en <em>Sign out</em>. Al salir, hagan clic en el botón verde para volver a la pantalla de inicio y ahora coloquen la información que usaron para crear su propio espacio de trabajo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834156886/mZoRxRERM.png" alt="Ingresar al espacio de trabajo" /></p>
<p>Es muy probable que la primera vez que ingresen les solicite que cambien la contraseña.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834158811/yBL49bE3G.png" alt="Espacio de trabajo" /></p>
<p>¡Y ya está! Finalmente están en un espacio de trabajo en blanco donde pueden empezar a crear aplicaciones desde cero. Si lo desean pueden ingresar a <strong>App Gallery</strong> para ver aplicaciones de demostración totalmente funcionales y que pueden servirles de base para sus propios proyectos.</p>
]]></content:encoded></item><item><title><![CDATA[Oracle XE con Vagrant]]></title><description><![CDATA[Usar una VM en lugar de tu equipo
He visto muchos blogs en español en los que explican cómo realizar la instalación de Oracle XE 18c en diversos sistemas operativos y todos ellos asumen que la instalación se realizará directamente sobre tu equipo de ...]]></description><link>https://blog.jeanomobono.com/oracle-xe-con-vagrant</link><guid isPermaLink="true">https://blog.jeanomobono.com/oracle-xe-con-vagrant</guid><category><![CDATA[Oracle]]></category><category><![CDATA[spanish]]></category><category><![CDATA[vagrant]]></category><dc:creator><![CDATA[Jean Carlos Omobono]]></dc:creator><pubDate>Mon, 15 Feb 2021 02:46:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664841358845/iaP4YyTHb.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-usar-una-vm-en-lugar-de-tu-equipo">Usar una VM en lugar de tu equipo</h1>
<p>He visto muchos blogs en español en los que explican cómo realizar la instalación de Oracle XE 18c en diversos sistemas operativos y todos ellos asumen que la instalación se realizará directamente sobre tu equipo de trabajo. Aunque esto no está mal, mi experiencia me ha enseñado que no es una buena idea instalar XE directamente en el sistema operativo de tu computador principal: las configuraciones del equipo pueden cambiar a medida que vas instalando nuevas aplicaciones y/o servicios, haciendo que tu instalación de XE se pueda volver inestable (o de hecho todo tu sistema operativo, sobre todo en las instalaciones en Windows).</p>
<p>El proceso que voy a explicarles es muy similar a usar <em>virtualenv</em> en Python para crear ambientes virtuales para las librerías que utilizarás en tus aplicaciones, o a la creación de contenedores con Docker para <a target="_blank" href="https://medium.com/rate-engineering/using-docker-containers-as-development-machines-4de8199fc662">crear máquinas de desarrollo completas</a>. De esta forma tienen un ambiente dedicado exclusivamente al servicio con el que desean trabajar.</p>
<h1 id="heading-vagrant-para-aliviar-el-proceso">Vagrant para aliviar el proceso</h1>
<p>No es necesario reinventar la rueda. Por lo general los tutoriales en español nos guían por el proceso completo de configuración del sistema operativo donde instalaremos la base de datos, incluyendo la instalación de paquetes, apertura de puertos, etc. Sin embargo ya Oracle ha publicado <em>scripts</em> que pueden aliviar la tarea.</p>
<p><a target="_blank" href="https://www.vagrantup.com/intro">Vagrant</a> es una herramienta para construir y administrar máquinas virtuales. Básicamente nos permite utilizar <em>scripts</em> con una configuración predefinida para la creación de una máquina virtual. La ventaja principal es que es posible usar estos <em>scripts</em> para crear tantas máquinas virtuales como necesites y todas ellas tendrán la misma configuración.</p>
<p>En este procedimiento utilizaremos VirtualBox para administrar la máquina virtual de Oracle XE, si aun no tienen instalado VirtualBox pueden seguir las <a target="_blank" href="https://www.virtualbox.org/wiki/Downloads">instrucciones</a> de instalación para su sistema operativo. Además, también debe instalar Vagrant siguiendo estas <a target="_blank" href="https://learn.hashicorp.com/tutorials/vagrant/getting-started-install?in=vagrant/getting-started">instrucciones</a>.</p>
<h1 id="heading-iniciar-la-instalacion">Iniciar la instalación</h1>
<p>Una vez que VirtualBox y Vagrant están instalados procederemos a descargar los scripts de Oracle que se encuentran en este <a target="_blank" href="https://github.com/oracle/vagrant-projects">repositorio</a> en GitHub. Pueden clonarlo o descargarlo totalmente y luego descomprimir el archivo en un directorio local de su preferencia. </p>
<p>En este ejemplo usaré un equipo con Ubuntu 20.04 como anfitrión, aunque las instrucciones son las mismas para cualquier sistema operativo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834167147/yx8Iz__Rj.png" alt="Directorio vagrant-projects" /></p>
<p>En mi caso hice una clonación del repositorio, en la imagen anterior se ve el contenido del directorio.</p>
<p>Antes de iniciar la creación de la máquina virtual, es importante hacer notar que si es la primera vez que estamos ejecutando Vagrant en nuestro equipo es recomendable tener una buena conexión a internet, ya que el <em>script</em> descargará tanto la imagen del sistema operativo (Oracle Linux 7) y el instalador de la base de datos XE.</p>
<p>Para iniciar la creación de la máquina virtual de Oracle XE 18c procederemos al directorio <code>vagrant-projects/OracleDatabase/18.4.0-XE</code> y ejecutaremos el comando <code>vagrant up</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834168895/PDM92bw4w.png" alt="Inicio con vagrant up" /></p>
<p>El proceso de instalación se encargará de:</p>
<ul>
<li>Descargar e instalar el sistema operativo (Oracle Linux 7)</li>
<li>Descargar e instalar las dependencias necesarias para la instalación de Oracle XE 18c.</li>
<li>Descargar e instalar Oracle XE 18c.</li>
<li>Configurar el redireccionamiento IP necesario para poder comunicarse con la VM desde el equipo anfitrión.</li>
</ul>
<p>El proceso de instalación puede tomar varios minutos dependiendo del ancho de banda de su conexión y/o de la potencia de su equipo; en la consola verán el progreso de la misma.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834170376/6S_uJSUqp.png" alt="Proceso de instalación 1" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834171874/1zW4wBGvS.png" alt="Procesao de instalación 2" /></p>
<p>Al finalizar el proceso tomen nota del usuario y contraseña de los usuarios <code>sys</code>, <code>system</code> y <code>pdbadmin</code> que aparecerán en la consola. (Si no pudieron tomar nota tampoco hay que entrar en pánico, es muy sencillo cambiar estas contraseñas y lo explicaré un poco más abajo)</p>
<p>¡Y eso es todo! Ya tienen una base de datos <strong>Oracle XE 18c</strong> funcional en su equipo. Para configurar un cliente como <strong>SQL Developer</strong> utilicen los siguientes datos:</p>
<ul>
<li>Hostname: <code>localhost</code></li>
<li>Port: <code>1521</code></li>
<li>SID: <code>XE</code></li>
<li>PDB: <code>XEPDB1</code></li>
<li>Usen las contraseñas generadas automáticamente</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834173558/ywHV5Jw1b.png" alt="Configuración SQL Developer" /></p>
<p>Si prefieren cambiar la contraseña pueden ingresar a la máquina usando el comando <code>vagrant ssh</code> estando en el mismo directorio desde el que ejecutaron <code>vagrant up</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1661834175108/vErM9pxVO.png" alt="Ingresando al VM con vagrant ssh" /></p>
<p>Una vez hayan ingresado a la máquina virtual ejecuten estos comandos:</p>
<p><code>sudo su - oracle</code></p>
<p><code>/home/oracle/setPassword.sh &lt;nuevoPassword&gt;</code></p>
<p>Donde <code>&lt;nuevoPassword&gt;</code> es la nueva contraseña que quieren utilizar. Recuerden que es posible que la base de datos exija que la contraseña cumpla con ciertos parámetros de complejidad.</p>
]]></content:encoded></item></channel></rss>