Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle PL/SQL - Raccolte (tabelle nidificate)

In questo tutorial imparerai come dichiarare e inizializzare raccolte Oracle PL/SQL (tabelle nidificate).

Oracle PL/SQL - Tabelle nidificate

Le tabelle annidate sono molto simili alle tabelle PL/SQL, note in Oracle come index-by tavoli. Le tabelle nidificate estendono la funzionalità di index-by tabella aggiungendo ulteriori metodi di raccolta (noti come attributi di tabella per index-by tabelle) e aggiungendo la possibilità di memorizzare tabelle nidificate all'interno di una tabella di database, motivo per cui vengono chiamate tabelle nidificate.

Le tabelle nidificate possono anche essere manipolate direttamente utilizzando SQL e sono disponibili eccezioni predefinite aggiuntive.

Oltre a queste funzionalità extra, la funzionalità di base di una tabella nidificata è la stessa di una tabella PL/SQL. Una tabella nidificata può essere considerata come una tabella di database con due colonne chiave e valore. Come index-tables , le tabelle nidificate possono essere sparse e le chiavi non devono essere sequenziali.

Dichiarazione di una tabella annidata

La sintassi per creare un tipo di tabella nidificata è

TYPE table_name is TABLE OF table_type [NOT NULL];

dove table_nameè il nome del nuovo tipo e table_type è il tipo di ogni elemento nella tabella nidificata. Table_type può essere un tipo integrato, un tipo di oggetto definito dall'utente o un'espressione che utilizza % TIPO.

Nota

L'unica differenza sintattica tra le tabelle index-by e le tabelle nidificate è la presenza della clausola INDEX BY BINARY_INTEGER. Se questa clausola non è presente, il tipo è un tipo di tabella nidificata. Se questa clausola è presente, il tipo è un tipo di tabella indice.

La seguente sezione dichiarativa di codice mostra alcune dichiarazioni di tabelle valide:

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 - Inizializzazione della tabella nidificata

Quando una tabella viene dichiarata come nel blocco precedente, viene inizializzata per essere atomicamente NULL, come un tipo di oggetto. Se si tenta di eseguire l'assegnazione a una tabella NULL, viene visualizzato l'errore "ORA-6531:riferimento a una raccolta non inizializzata " che corrisponde all'eccezione predefinita COLLECTION_IS_NULL , viene sollevato.

Continuando l'esempio precedente, la seguente sezione di esecuzione genererà questo errore:

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;

Quindi, come si inizializza una tabella nidificata? Questo può essere fatto usando il costruttore. Come un costruttore di tipi di oggetto, il costruttore di una tabella nidificata ha lo stesso nome del tipo di tabella stesso. Tuttavia, prende come argomento un elenco di elementi, ognuno dei quali dovrebbe essere compatibile con il tipo di elemento della tabella.

L'esempio seguente illustra l'uso del costruttore di tabelle 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;

Tabelle vuote

Nota la dichiarazione di v_Tab2 nel blocco precedente:

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

v_Tab2 viene inizializzato chiamando il costruttore senza argomenti. Questo crea una tabella che non ha elementi ma non è atomicamente NULL. Il blocco seguente illustra questo:

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;

Se eseguiamo questo blocco otteniamo il seguente output:

v_Tab1 is NULL
v_Tab2 is not NULL

Chiavi all'inizializzazione

Quando una tabella viene inizializzata utilizzando un costruttore, gli elementi della tabella vengono numerati in sequenza, da 1 al numero di elementi specificato nella chiamata del costruttore. Durante l'elaborazione successiva, i valori memorizzati in alcune chiavi potrebbero essere eliminati (utilizzando il metodo DELETE). quando una tabella nidificata viene selezionata dal database, le chiavi vengono rinumerate se necessario per essere sequenziali come sono all'inizializzazione.