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.