Collection PL/SQL – TYPE TABLE OF

En Oracle el manejo de Collection es muy importante cuando se tiene varios datos no definidos. Ya que no existen los objetos por ser un lenguaje estructurado.

A continuación se detalla el uso de una Collection Simple.

Una Collection, se forma de dos partes: INDEX y VALUE. Donde el INDEX, será nuestra llave de acceso para localizar nuestro VALUE.

Para crear una Collection de este tipo se utilizan dos pasos:

1. Creación del tipo (type)

                Utilizamos la sentencia:

                  TYPE type_name IS TABLE OF XXXXX INDEX BY YYYYY;

                Dónde:

                               XXXXX : Indica el tipo de dato que almacenará nuestra  Collection (VALUE)

                               YYYYY : Indica el tipo de dato que utilizaremos para el INDEX.

                Es importante, notar que el INDEX, solo permite los tipos de datos: VARCHAR2 ó BINARY_INTEGER

                Ejemplo:

                                 TYPE estructura_t IS TABLE OF DATE INDEX BY VARCHAR2(255);

                                 INDEX: De tipo Varchar2

                                 VALUE: De tipo DATE

2. Creación de la Variable

                Con el tipo creado (declarado) procedemos a declarar la variable a utilizar:

                               estructura estructura_t;

Para agregar valores solo haremos lo siguiente (respetando los tipos de INDEX y VALUE declarados en el Tipo):

 estructura('MIERCOLES') := SYSDATE - 10;
estructura('LUNES') := SYSDATE;
estructura('MARTES') := SYSDATE - 3; 

Sin importar el orden en que los valores sean agregados, siempre serán ordenados en base al valor del INDEX.

Y punto a recordar, si buscamos un INDEX que no existe, este tipo de Collection devuelven un NO DATA FOUND.

Aquí el ejemplo completo:

DECLARE
--
TYPE estructura_t IS TABLE OF DATE --TIPO DATO A ALMACENAR
INDEX BY VARCHAR2(255); --TIPO DATO POR EL QUE SE ACCEDE (INDEX)
estructura estructura_t;
--
  l_idx         varchar2(30);
  IDX_NO_EXISTE NUMBER := '45';
BEGI
   --Llenado de estructura
  estructura('MIERCOLES') := SYSDATE - 10;
  estructura('LUNES') := SYSDATE;
  estructura('MARTES') := SYSDATE - 3;
  --Recorrerlos de Forma lineal
  l_idx := estructura.FIRST;
  LOOP
    EXIT WHEN l_idx IS NULL;
    dbms_output.put_line('[' || l_idx || '] : [' ||estructura(l_idx) || ']');
    l_idx := estructura.NEXT(l_idx);
  END LOOP;
  --No encontrado
  BEGIN
    dbms_output.put_line('[' ||estructura(IDX_NO_EXISTE) || ']');
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      dbms_output.put_line('INDEX NO ENCONTRADO: [' || IDX_NO_EXISTE || ']');
  END;
END;

Resultado: