Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle PL/SQL - Sammlungen (verschachtelte Tabellen)

In diesem Tutorial erfahren Sie, wie Sie Oracle PL/SQL-Sammlungen (verschachtelte Tabellen) deklarieren und initialisieren.

Oracle PL/SQL - Verschachtelte Tabellen

Verschachtelte Tabellen sind den PL/SQL-Tabellen sehr ähnlich, die in Oracle als index-by bekannt sind Tische. Verschachtelte Tabellen erweitern die Funktionalität von index-by Tabelle durch Hinzufügen zusätzlicher Sammelmethoden (bekannt als Tabellenattribute für index-by Tabellen) und durch Hinzufügen der Möglichkeit, verschachtelte Tabellen innerhalb einer Datenbanktabelle zu speichern, weshalb sie als verschachtelte Tabellen bezeichnet werden.

Verschachtelte Tabellen können auch direkt mit SQL manipuliert werden und verfügen über zusätzliche vordefinierte Ausnahmen.

Abgesehen von diesen zusätzlichen Funktionen ist die grundlegende Funktionalität einer verschachtelten Tabelle die gleiche wie bei einer PL/SQL-Tabelle. Eine verschachtelte Tabelle kann man sich wie eine Datenbanktabelle mit zwei Spalten – Schlüssel und Wert – vorstellen. Wie index-tables , verschachtelte Tabellen können spärlich sein und die Schlüssel müssen nicht sequenziell sein.

Eine verschachtelte Tabelle deklarieren

Die Syntax zum Erstellen eines verschachtelten Tabellentyps lautet

TYPE table_name  ist TABLE OF table_type  [NICHT NULL];

wobei Tabellenname der Name des neuen Typs und table_type ist ist der Typ jedes Elements in der verschachtelten Tabelle. Table_type kann ein integrierter Typ, ein benutzerdefinierter Objekttyp oder ein Ausdruck sein, der % verwendet TYP.

Hinweis

Der einzige syntaktische Unterschied zwischen Index-by-Tabellen und verschachtelten Tabellen ist das Vorhandensein der Klausel INDEX BY BINARY_INTEGER. Wenn diese Klausel nicht vorhanden ist, ist der Typ ein verschachtelter Tabellentyp. Wenn diese Klausel vorhanden ist, dann ist der Typ ein Indextabellentyp.

Der folgende deklarative Codeabschnitt zeigt einige gültige Tabellendeklarationen:

DECLARE – Definieren Sie einen Tabellentyp auf der Grundlage eines Objekttyps /pre> 

Oracle PL/SQL - Initialisierung verschachtelter Tabellen

Wenn eine Tabelle wie im vorherigen Block deklariert wird, wird sie wie ein Objekttyp atomar NULL initialisiert. Wenn Sie versuchen, eine NULL-Tabelle zuzuweisen, wird der Fehler „ORA-6531:Reference to uninitialized collection " was der vordefinierten Ausnahme COLLECTION_IS_NULL entspricht , wird ausgelöst.

In Fortsetzung des vorherigen Beispiels wird der folgende Ausführungsabschnitt diesen Fehler auslösen:

BEGIN--Diese Zuweisung löst COLLECTION_IS_NULL aus, weil--v_ClassList automatisch null ist.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END;

Wie initialisiert man also eine verschachtelte Tabelle? Dies kann mithilfe des Konstruktors erfolgen. Wie ein Objekttypkonstruktor hat der Konstruktor für eine verschachtelte Tabelle denselben Namen wie der Tabellentyp selbst. Als Argument wird jedoch eine Liste von Elementen verwendet, von denen jedes typkompatibel mit dem Tabellenelementtyp sein sollte.

Das folgende Beispiel veranschaulicht die Verwendung des nsat3eed-Tabellenkonstruktors:

DECLARETYPE t_NumbersTab IS TABLE OF NUMBER;-- Erstellt eine Tabelle mit einem Element.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Erstellt eine Tabelle mit fünf Elementen.v-Primes t_numbersTab :=t_NumbersTab(1, 2, 3 , 5, 7);-- Erstellen Sie eine Tabelle ohne Elemente.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Weisen Sie v_Tab1(1) zu. Dies ersetzt den Wert ready-- in v_Tab(1), der auf -1 initialisiert wurde.v_Tab(1) :=12345;END;

Leere Tabellen

Beachten Sie die Deklaration von v_Tab2 im vorhergehenden Block:

-- Erstellt eine Tabelle ohne Elemente.v_Tab2 t_NumbersTab :=t_NumbersTab();

v_Tab2 wird initialisiert, indem der Konstruktor ohne Argumente aufgerufen wird. Dadurch wird eine Tabelle erstellt, die keine Elemente enthält, aber nicht atomar NULL ist. Der folgende Block veranschaulicht dies:

DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50);--Erzeuge eine NULL-Tabelle.v_Tab1 t_WordsTab;--Erzeuge eine Tabelle mit einem Element, das selbst NULL ist.v_Tab2 t_WordsTab :=t_WordsTab();BEGINIF v_Tab1 IS NULL THENDBMS_OUTPUT .PUT_LINE('v_Tab1 ist NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab ist nicht NULL');END IF;IF v_Tab2 IS NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 ist NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab2 ist nicht NULL' );END IF;END;

Wenn wir diesen Block ausführen, erhalten wir die folgende Ausgabe:

v_Tab1 ist NULLv_Tab2 ist nicht NULL

Schlüssel bei der Initialisierung

Wenn eine Tabelle mit einem Konstruktor initialisiert wird, werden die Elemente der Tabelle fortlaufend nummeriert und reichen von 1 bis zu der im Konstruktoraufruf angegebenen Anzahl von Elementen. Bei einer späteren Verarbeitung können die an einigen Schlüsseln gespeicherten Werte gelöscht werden (mit der DELETE-Methode). Wenn eine verschachtelte Tabelle aus der Datenbank ausgewählt wird, werden die Schlüssel bei Bedarf neu nummeriert, damit sie wie bei der Initialisierung sequenziell sind.