Saltar la navegación

6.1.- Declaración y uso de colecciones.

La declaración de estos tipos de colecciones sigue el formato siguiente:

TYPE nombre_tipo IS VARRAY (tamaño_max) OF tipo_elemento;
TYPE nombre_tipo IS TABLE OF tipo_elemento;
TYPE nombre_tipo IS TABLE OF tipo_elemento INDEX BY tipo_índice;

Donde nombre_tipo representa el nombre de la colección, tamaño_max es el número máximo de elementos que podrá contener la colección, y tipo_elemento es el tipo de dato de los elementos que forman la colección. El tipo de elemento utilizado puede ser también cualquier tipo de objetos declarado previamente.

En caso de que la declaración se haga en SQL, fuera de un subprograma PL/SQL, se debe declarar con el formato

CREATE [OR REPLACE] TYPE.
CREATE TYPE nombre_tipo IS ...

tipo_índice representa el tipo de dato que se va a utilizar para el índice. Puede ser PLS_INTEGER, BINARY_INTEGER o VARCHAR2. En este último tipo se debe indicar entre paréntesis el tamaño que se va a utilizar para el índice, por ejemplo, VARCHAR2(5).

Hasta que no sea inicializada una colección, ésta es NULL. Para inicializar una colección debes utilizar el constructor, que es una función con el mismo nombre que la colección. A esta función se le pasa como parámetros los valores iniciales de la colección. Por ejemplo:

DECLARE
	TYPE Colores IS TABLE OF VARCHAR(10);
	misColores Colores;
BEGIN
	misColores := Colores('Rojo', 'Naranja', 'Amarillo', 'Verde', 'Azul');
END;

La inicialización se puede realizar en el bloque de código del programa, o bien, directamente en el bloque de declaraciones como puedes ver en este ejemplo:

DECLARE
	TYPE Colores IS TABLE OF VARCHAR(10);
	misColores Colores := Colores('Rojo', 'Naranja', 'Amarillo', 'Verde', 'Azul');

Para obtener uno de los elementos de la colección o modificar su contenido debes indicar el nombre de la colección seguido, entre paréntesis, del índice que ocupa el elemento deseado. Tanto en los VARRAY como en NESTED TABLE, el primer elemento tiene el índice 1.

Por ejemplo, para mostrar en pantalla el segundo elemento ('Naranja') de la colección Colores:

dbms_output.put_line(misColores(2));

En el siguiente ejemplo se modifica el contenido de la posición 3:

misColores(3) := 'Gris';

En el siguiente ejemplo puedes comprobar cómo pueden utilizarse las colecciones para almacenar sus datos en una tabla de la base de datos, así como la utilización con sentencias de consulta y manipulación de los datos de la colección que se encuentra en la tabla.

CREATE TYPE ListaColores AS TABLE OF VARCHAR2(20);
/
CREATE TABLE flores (nombre VARCHAR2(20), coloresFlor ListaColores)
	NESTED TABLE coloresFlor STORE AS colores_tab;
 
DECLARE
	colores ListaColores;
BEGIN
	INSERT INTO flores VALUES('Rosa', ListaColores('Rojo','Amarillo','Blanco'));
	colores := ListaColores('Rojo','Amarillo','Blanco','Rosa Claro');
	UPDATE flores SET coloresFlor = colores WHERE nombre = 'Rosa';
	SELECT coloresFlor INTO colores FROM flores WHERE nombre = 'Rosa';
END;/

Al definir una tabla que contiene un atributo que es de tipo tabla, es necesario darle un nombre de almacenamiento a  NESTED TABLE mediante la clausula STORE AS que es un nombre interno y no se puede utilizar para acceder directamente a la tabla anidada.