Continuando con el tema de las colecciones APEX, en esta entrada quiero centrarme en tres acciones específicas que tienen que ver con la creación y acceso a las mismas:

  • Nombrado de colecciones
  • Creado de colecciones
  • Acceso de colecciones

Nombrado de colecciones

Toda colección que creemos, debe tener un nombre que la identifique de manera única. Este sombre debe cumplir con las siguientes características:

  1. No debe ser mayor de 255 caracteres
  2. No son sensitivos a mayúsculas o minúsculas, pues son convertidos a mayúsculas
  3. Este nombre nos sirve para acceder a los valores de la colección al ejecutar una consulta SQL contra la vista APEX_COLLECTIONS

Al final de esta entrada encontrarán un ejemplo de una consulta SQL de una colección.

Creado de colecciones

Como se mencionó en la entrada anterior, cada colección contiene una lista de elementos de datos o miembros de las características y en las cantidades allí mencionadas. Para crear una colección, podemos usar los siguientes métodos:

CREATE_COLLECTION Este método crea una colección vacía con el nombre que se proporciona. Si la colección ya existe, entonces se produce una excepción.

Ejemplo:

    Begin
      apex_collection.create_collection(
      p_collection_name => ‘Salarios’);
    End;

En este ejemplo, estamos creando una colección vacía llamada “Salarios”.

CREATE_OR_TRUNCATE_COLLECTION Si el nombre de la colección que se proporciona no existe, este método crea una colección vacía con el mismo. Si el nombre de la colección ya existe, este método la trunca, lo que implica vaciarla pero mantenerla en su lugar.

Un ejemplo de este método, similar al anterior, sería:

     Begin
       apex_collection.create_or_truncate_collection(
       p_collection_name => ‘Salarios’);
     End;

 

CREATE_COLLECTION_FROM_QUERY Con este método creamos una colección y la poblamos con los resultados de la consulta especificada. Si la colección ya existe vamos a recibir una excepción como resultado. Este método se puede utilizar con una consulta de hasta 50 columnas en una sentencia SELECT, la cual puebla o rellenas los 50 atributos tipo carácter de la colección (c001 a c050).

En el siguiente ejemplo, creamos una colección de nombre “EMPLEADOS” y le agregamos los datos de los empleados en la tabla EMPLEADOS:

     Begin
       w_query := ‘select nombre, puesto, oficina, ciudad from EMPLEADOS’;
       apex_collections.create_collection_from_query(
       p_collection_name => ‘EMPLEADOS’,
       p_query => w_query,
       p_generate_md5 => ‘YES’);
     End;

 

CREATE_COLLECTION_FROM_QUERY2 Este método es idéntico al anterior, sin embargo, las 5 primeras columnas de la sentencia SELECT deben ser numéricas, luego de las cuales puede haber hasta 50 columnas de tipo carácter en la sentencia.

En este ejemplo, incluimos la consulta directamente en el llamado del método y creamos una colección llamada “NOMINA” a partir de una tabla llamada “SALARIOS”:

    Begin
       apex_collections.create_collection_from_query2(
       p_collection_name => ‘EMPLEADOS’,
       p_query => ‘select no_empleado, salario, comision, depto, null, fecha_ingreso, 
                   null, null, null, null, nombre, puesto, oficina, ciudad from SALARIOS’,
       p_generate_md5 => ‘NO’);
    End;

Del ejemplo anterior, deberían tomar nota de lo siguiente:

  • Si no tenemos cinco columnas de tipo numérico que seleccionar, se deben completar las mismas con columnas nulas.
  • Se agrega además una columna de tipo fecha y como en el caso anterior, se debe completar a cinco columnas con valores nulos, pues como se explicó en la entrada anterior, la cantidad de miembros de tipo fecha de una colección es de 5.
  • No se está calculando el valor de verificación MD5 en este caso.
CREATE_COLLECTION_FROM_QUERY_B Este método es mucho más rápido que el método CREATE_COLLECTION_FROM_QUERY, al ejecutar operaciones de SQL en bulto, pero tiene las siguientes limitaciones:

  • El valor de las columnas en la lista de selección no puede ser mayor a 2000 bytes, en caso contrario, un error es levantado durante la ejecución.
  • El valor de verificación MD5 no es computado para ningún miembro de la colección.

En el ejemplo siguiente, se puede observar que como se comentó arriba, el valor de verificación MD5 no se calcula, y el formato es igual al del método CREATE_COLLECTION_FROM_QUERY:

    Begin
       w_query := ‘select nombre, puesto, oficina, ciudad from EMPLEADOS’;
       apex_collections.create_collection_from_query(
       p_collection_name => ‘EMPLEADOS’,
       p_query => w_query,
       p_generate_md5 => ‘YES’);
    End;

 

CREATE_COLLECTION_FROM_QUERYB2 Este método es idéntico al anterior, sin embargo, las cinco primeras columnas de la sentencia SELECT deben ser numéricas, luego de las cuales se pueden incluir hasta 50 columnas de tipo carácter.

En este caso, siguiendo con los ejemplos de arriba, el de este método se vería así:

    Begin
       w_query := ‘select no_empleado, salario, comision, depto, null, fecha_ingreso,
                    null, null, null, null, nombre, puesto, oficina, ciudad from SALARIOS’
       apex_collections.create_collection_from_query2(
       p_collection_name => ‘EMPLEADOS’,
       p_query => w_query,
       p_generate_md5 => ‘NO’);
    End;

 

Acceso de colecciones

Se puede acceder a los miembros de una colección consultando la vista de base de datos APEX_COLLECTIONS, la cual tiene la siguiente definición:

     Nombre          ¿Nulo?   Tipo
     --------------- -------- --------------
     COLLECTION_NAME NOT NULL VARCHAR2(255)
     SEQ_ID          NOT NULL NUMBER
     C001                     VARCHAR2(4000)
     ...
     C050                     VARCHAR2(4000)
     CLOB001                  CLOB
     BLOB001                  BLOB
     XMLTYPE001               SYS.XMLTYPE
     N001                     NUMBER
     ...
     N005                     NUMBER
     D001                     DATE
     ...
     D005                     DATE
     MD5_ORIGINAL             VARCHAR2(4000)

Utilizamos la vista APEX_COLLECTIONS en nuestras aplicaciones de la misma manera en que lo hacemos con cualquier otra vista o tabla de nuestras aplicaciones, como por ejemplo:

     SELECT c001, c002, c003, n001, d001, clob001
       FROM apex_collections
      WHERE collection_name = ‘NOMINA’

En este caso estamos seleccionando los tres primeros miembros de tipo carácter, el primer miembro numérico, el primer miembro de tipo fecha y el miembro de tipo CLOB de la colección llamada “NOMINA”.

En la siguiente entrada estaré explicando como “unir”, truncar y eliminar colecciones.

Share This