sql >> Base de Datos >  >> RDS >> Oracle

Oracle PL/SQL - Colecciones (tablas anidadas)

En este tutorial, aprenderá a declarar e inicializar colecciones de Oracle PL/SQL (tablas anidadas).

Oracle PL/SQL - Tablas anidadas

Las tablas anidadas son muy similares a las tablas PL/SQL, que en Oracle se conocen como index-by mesas. Las tablas anidadas amplían la funcionalidad de index-by tabla agregando métodos de recopilación adicionales (conocidos como atributos de tabla para index-by tablas) y agregando la capacidad de almacenar tablas anidadas dentro de una tabla de base de datos, razón por la cual se llaman tablas anidadas.

Las tablas anidadas también se pueden manipular directamente mediante SQL y tienen disponibles excepciones predefinidas adicionales.

Aparte de estas características adicionales, la funcionalidad básica de una tabla anidada es la misma que la de una tabla PL/SQL. Una tabla anidada se puede considerar como una tabla de base de datos con dos columnas:clave y valor. Como index-tables , las tablas anidadas pueden ser escasas y las claves no tienen que ser secuenciales.

Declaración de una tabla anidada

La sintaxis para crear un tipo de tabla anidada es

TYPE table_name is TABLE OF table_type [NOT NULL];

donde table_name es el nombre del nuevo tipo y table_type es el tipo de cada elemento en la tabla anidada. Table_type puede ser un tipo incorporado, un tipo de objeto definido por el usuario o una expresión usando % TIPO.

Nota

La única diferencia sintáctica entre las tablas indexadas y las tablas anidadas es la presencia de la cláusula INDEX BY BINARY_INTEGER. Si esta cláusula no está presente, entonces el tipo es un tipo de tabla anidada. Si esta cláusula está presente, entonces el tipo es un tipo de tabla de índice.

La siguiente sección de código declarativa muestra algunas declaraciones de tabla válidas:

DECLARE
--Define a table type based on an object type
TYPE t_ClassTab IS TABLE OF Classobj;


--A type based on%ROWTYPE
Type t_StudentsTab IS TABLE Of students%ROWTYPE;

--Variables of the above types
v_ClassList t_ClassesTab;
v_StudentList t_StudentsTab;

Oracle PL/SQL - Inicialización de tablas anidadas

Cuando se declara una tabla como en el bloque anterior, se inicializa para ser atómicamente NULL, como un tipo de objeto. Si intenta asignar a una tabla NULL, aparece el error "ORA-6531:Referencia a colección no inicializada " que corresponde a la excepción predefinida COLLECTION_IS_NULL , está elevado.

Continuando con el ejemplo anterior, la siguiente sección de ejecución generará este error:

BEGIN
--This assignment will raise COLLECTION_IS_NULL because
--v_ClassList is automatically null.
v_ClassList(1) := ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);
END;

Entonces, ¿cómo se inicializa una tabla anidada? Esto se puede hacer usando el constructor. Al igual que un constructor de tipo de objeto, el constructor de una tabla anidada tiene el mismo nombre que el propio tipo de tabla. Sin embargo, toma como argumento una lista de elementos, cada uno de los cuales debe ser compatible con el tipo de elemento de la tabla.

El siguiente ejemplo ilustra el uso del constructor de tablas nsat3eed:

DECLARE
TYPE t_NUmbersTab IS TABLE OF NUMBER;

-- Create a table with one element.
v_Tab1 t_NumbersTab := t_NumbersTab(-1);

-- Create a table with five elements.
v-Primes t_numbersTab := t_NumbersTab(1, 2, 3 , 5, 7);

-- Craete a table with no elemnts.
v_Tab2 t_NumbersTab := t_NumbersTab();
BEGIN
-- Assign to v_Tab1(1). This will replace the value ready
-- in v_Tab(1), which was initilized to -1.
v_Tab(1) := 12345;
END;

Mesas Vacías

Tenga en cuenta la declaración de v_Tab2 en el bloque anterior:

-- Create a table with no elements.
v_Tab2 t_NumbersTab := t_NumbersTab();

v_Tab2 se inicializa llamando al constructor sin argumentos. Esto crea una tabla que no tiene elementos pero que no es atómicamente NULL. El siguiente bloque ilustra esto:

DECLARE
TYPE t_WordsTab IS TABLE OF VARCHAR2(50);

--Create a NULL table.
v_Tab1 t_WordsTab;

--Create a table with one element, which itself is NULL.
v_Tab2 t_WordsTab := t_WordsTab();
BEGIN
IF v_Tab1 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('v_Tab1 is NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('v_Tab is not NULL');
END IF;

IF v_Tab2 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('v_Tab2 is NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('v_Tab2 is not NULL');
END IF;
END;

Si ejecutamos este bloque obtenemos el siguiente resultado:

v_Tab1 is NULL
v_Tab2 is not NULL

Claves en la inicialización

Cuando se inicializa una tabla mediante un constructor, los elementos de la tabla se numeran secuencialmente, desde 1 hasta el número de elementos especificado en la llamada del constructor. Durante el procesamiento posterior, los valores almacenados en algunas teclas pueden eliminarse (usando el método DELETE). cuando se selecciona una tabla anidada de la base de datos, las claves se vuelven a numerar si es necesario para que sean secuenciales como lo son en la inicialización.