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: