Uso de Colecciones en Oracle APEX

Uso de Colecciones en Oracle APEX

Introducción

Se preguntarán ¿Qué son las Colecciones en APEX?

Las colecciones le permiten capturar temporalmente uno o más valores no escalares. Puedes utilizar colecciones para almacenar filas y columnas en estado de sesión para que se puedan acceder a ellas, manipularlas o procesarlas durante la sesión específica de un usuario. Se podría pensar en una colección como un depósito temporal para almacenar filas de información.

¿Impresionante verdad? no te preocupes, aquí veremos cómo utilizarlas. :)

Cada colección contiene una lista con nombre de elementos de datos (o miembros) que pueden contener:

  • 50 atributos de caracteres VARCHAR2(4000).

  • 5 atributos numéricos.

  • 5 atributos de fecha.

  • 1 atributo de tipo XML.

  • 1 atributo de tipo BLOB.

  • y 1 atributo de tipo CLOB.

¿Cómo creamos una Colección en APEX?

Hay varias formas de crear una Colección, en este caso veremos 3 de ellas que nos serán muy útiles.

Utilizando CREATE_COLLECTION

La sintaxis sería:

APEX_COLLECTION.CREATE_COLLECTION(
    p_collection_name    IN VARCHAR2,
    p_truncate_if_exists IN VARCHAR2 default 'NO');

Este método crea una colección vacía con el nombre proporcionado.
Ejemplo:

Begin
    APEX_COLLECTION.CREATE_COLLECTION('EMPLEADOS');
End;

Al momento de crear una colección debes tener en cueta que el nombre no debe exceder los 255 caracteres, tampoco distinguen entre mayúsculas o minúsculas y al crearlas lo convierte en nombre a mayúsculas.

En caso de querer reutilizar una colección podemos hacerlo de esta forma:

Begin
    APEX_COLLECTION.CREATE_COLLECTION('EMPLEADOS','YES');
End;

Lo que hará esto es vaciar la colección y cargar los nuevos datos. Si no especificamos el segundo parámetro, por default lo tomará como NO y nos arrojará una excepción.

Se puede evitar esto mediante el segundo método de creación.

Utilizando CREATE_OR_TRUNCATE_COLLECTION

La sintaxis en este caso es muy simple y solo consta de un parámetro que sería p_collection_name:

Begin
    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
        p_collection_name => 'EMPLEADOS');
End;

Este método es muy útil ya que por default vacia los datos que posea la colección en caso de que ya exista y carga los nuevos datos.

Utilizando CREATE_COLLECTION_FROM_QUERY

En este caso la Colección se crea en base a un query y podrá almacenar hasta 50 columnas provenientes de la consulta.

APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY (
    p_collection_name    IN VARCHAR2,
    p_query              IN VARCHAR2,
    p_generate_md5       IN VARCHAR2 default 'NO',
    p_truncate_if_exists IN VARCHAR2 default 'NO');

Como vemos, también incluye el parámetro de vaciar la colección si ya existe y por defualt le asignará un NO, también incluye un código MD5 el cuál puede ser utilizado para verificar si ya existe o no otro miembro similar.

Por ejemplo un caso de uso sería:

declare
    v_consulta varchar2(100);
Begin
    --Modo completo
    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY (
        p_collection_name => 'AUTOS', 
        p_query => 'select marca, modelo, anio from AUTOS',
        p_generate_md5 => 'YES',
        p_truncate_if_exists => 'YES');
    --Modo directo
    v_consulta := 'select marca, modelo, anio from AUTOS';
    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY ('AUTOS',v_consulta,'YES','YES');
End;

¿Cómo acceder a las Colecciones?

Para acceder a los datos de las colecciones, lo hacemos mediante un select a la tabla APEX_collections especificando el nombre de nuestra colección.

  • Los nombres de las Colecciones deben ir siempre en mayúsculas.

  • Estas columnas de la cláusula SELECT completan los atributos de 50 caracteres de la colección (C001 a C050), a esto se deben agregar los demás tipos de columnas.

por ejemplo:

SELECT c001, c002, c003, n001, d001, clob001
   FROM APEX_collections
 WHERE collection_name = 'EMPLEADOS'

¿Cómo eliminar o Vaciar una colección?

Para eliminar una colección solo necesitamos el nombre de la misma, luego ejecutamos lo sgte.

Begin
    APEX_COLLECTION.DELETE_COLLECTION('EMPLEADOS');
End;

Pero Osvaldo, ¿Y si no quiero eliminar la colección y solo quiero vaciarla para volverla a utilizar?

Simple, solo debes ejecutar esto

BEGIN;
    APEX_COLLECTION.TRUNCATE_COLLECTION('EMPLEADOS');
END;

Administrar miembros de una Colección

Las colecciones se manejan por numeraciones llamadas sequence ID, lo que identifica a cada miembro para su posible manipulación. Aclarado esto, procedemos a las muestras.

Agregar Miembro

DECLARE
    l_seq number; --Almacena el código de secuencia del nuevo miembro
BEGIN
    l_seq := APEX_COLLECTION.ADD_MEMBER(
                 p_collection_name => 'EMPLEADOS',
                 p_c001            => 'Lionel',
                 p_c002            => 'Telmo',
                 p_n001            => 123,
                 p_d001            => sysdate);
END;

Actualizar Miembro

BEGIN;
    APEX_COLLECTION.UPDATE_MEMBER (
        p_collection_name => 'EMPLEADOS',
        p_seq => '2', --código de secuencia del miembro
        p_c001 => 'LIONEL',
        p_c002 => 'MESSI');
END;

Eliminar Miembro

Begin
    APEX_COLLECTION.DELETE_MEMBER(
        p_collection_name => 'EMPLEADOS',
        p_seq => '2'); --código de secuencia del miembro
End;

Eliminar brechas en una Colección

Bueno, ahora supongamos que hayas eliminado varios registros aleatorios en tu colección quedaría con el siguiente conjunto de ID de secuencia (1,2,5,7,8,10). Entonces ¿Cómo vuelvo a tener un ID de secuencia consecutivo? con la función RESEQUENCE_COLLECTION esto hará que tus ID de secuencia vuelvan a verse así (1,2,3,4,5,6).

BEGIN;
    APEX_COLLECTION.RESEQUENCE_COLLECTION ('EMPLEADOS');
END;

¿Se pueden ver las colecciones desde SQL Developer u otro gestor de Base de Datos?

Por defecto las colecciones solo son accesibles desde Oracle APEX, pero es posible acceder a ellas desde nuestro gestor de base de datos trabajando con las sesiones de APEX, en concreto con el procedimiento APEX_SESSION.ATTACH.

Este procedimiento configura el entorno y ejecuta el código PL/SQL para anclar nuestra sesión en APEX a la base de datos según la aplicación, la página y la sesión que le indiquemos.

Anclar la sesión

Ingresamos a nuestro gestor de BD de preferencia y ejecutamos el siguiente código con los datos de nuestra app y página en donde se esta creando dicha colección:

begin
    apex_session.attach (
        p_app_id       => 101,
        p_page_id      => 23,
        p_session_id   => '16653041318126'
    );
end;

Con esto ya tendremos acceso a los datos de nuestra colección desde el SQL Developer a otros gestores de base de datos como DBeaver o PLSQL Developer.

Finalizar el anclaje

Para finalizar el anclaje de la sesión, desde el SQL Developer ejecutamos el siguiente código. lo que desvinculará nuestro SQL Developer de la sesión de la aplicación y por ende ya no tendremos acceso a los datos de la colección.

begin
    apex_session.detach;
end;

Conclusión

Hemos visto cómo crear una colección de distintas maneras y como vaciarlas o eliminarlas, tambien como manipular los datos. verán las colecciones son aliadas muy últiles para el desarrollo y funcionamiento de nuestros softwares, ya que nos permite manipular grandes cantidades de datos sin tener que crear tablas físicas o tablas temporales constantemente.
Espero que este post haya sido de ayuda para adentrarle en el uso de las colecciones y desbloquar su potencial.

No olvides seguirme en las redes sociales para enterarte de nuevos post.

Saludos y sigamos aprendiendo!!