Oracle PL/SQL-Sammlungen: Varrays, verschachtelt und Index nach Tabellen

⚡ Intelligente Zusammenfassung

PL/SQL-Collections sind geordnete Gruppen von Elementen desselben Datentyps, die jeweils über einen Index aufgerufen werden. Drei Typen – Varray, verschachtelte Tabelle und Index-by-Tabelle – unterscheiden sich darin, ob die Größe fest ist, wie der Index funktioniert und ob sie in der Datenbank gespeichert werden können.

  • 🧺 Definition: Eine Sammlung enthält viele Elemente eines Typs, die jeweils durch einen eindeutigen Index gekennzeichnet sind.
  • 📐 Varray: Feste obere Größe, immer dicht, numerischer Index, muss vor der Verwendung initialisiert werden.
  • 📚 Verschachtelte Tabelle: Keine Größenbeschränkung, kann dicht oder spärlich sein, wird in einer Systemtabelle gespeichert und kann mit EXTEND erweitert werden.
  • 🔑 Index-nach-Tabelle: Keine Größenbeschränkung, der Index kann eine Zeichenkette oder eine negative ganze Zahl sein, wird nicht in der Datenbank gespeichert.
  • ???? ️ Konstrukteur: Varray und verschachtelte Tabellen benötigen einen expliziten Konstruktor zur Initialisierung vor dem Zugriff.
  • Methods: COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM und DELETE verwalten eine Sammlung.
  • Bulk: BULK COLLECT füllt eine Sammlung in einem Schritt für eine schnelle Verarbeitung.

Oracle PL/SQL-Sammlungen

Was ist eine Sammlung?

Eine Sammlung ist eine geordnete Gruppe von Elementen eines bestimmten Datentyps. Es kann sich um eine Sammlung einfacher oder komplexer Datentypen wie benutzerdefinierter Datentypen oder Datensatztypen handeln.

In einer Sammlung wird jedes Element durch einen Begriff identifiziert, der als … bezeichnet wird. "Index." Jedem Element wird ein eindeutiger Index zugewiesen, und die Daten können durch Bezugnahme auf diesen eindeutigen Index bearbeitet oder abgerufen werden.

Sammlungen sind besonders nützlich, wenn große Datenmengen desselben Typs verarbeitet oder bearbeitet werden müssen. Sammlungen können als Ganzes mit der Option „BULK“ befüllt und bearbeitet werden. Oracle.

Sammlungen werden anhand ihrer Struktur, ihres Index und ihres Speicherorts klassifiziert, wie unten dargestellt:

  • Index-by-Tabellen (auch bekannt als assoziative Arrays)
  • Verschachtelte Tabellen
  • Varrays

Zu jedem Zeitpunkt können Daten in einer Sammlung durch drei Begriffe referenziert werden: Sammlungsname, Index und Feld- oder Spaltenname, wie folgt: ( ). In den folgenden Abschnitten erfahren Sie mehr über diese Sammlungskategorien.

Sammlungsarten auf einen Blick

Die drei Sammlungsarten bringen unterschiedliche Vor- und Nachteile mit sich. Die folgende Tabelle stellt sie einander gegenüber, bevor jede einzelne detailliert erläutert wird.

Aspekt Varray Verschachtelte Tabelle Index nach Tabelle
Größe Feste Obergrenze Keine Beschränkung Keine Beschränkung
Index Numerisch Numerisch Ganzzahl oder Zeichenkette
Signaldichte Immer dicht Dicht oder spärlich Immer spärlich
In der Datenbank gespeichert Ja Ja Nein
Initialisierung erforderlich Ja Ja Nein

Varrays

Ein Varray ist eine Sammlung mit fester Größe, die nicht überschritten werden kann. Der Index eines Varrays ist ein numerischer Wert. Die Attribute von Varrays sind:

  • Die maximale Größe ist festgelegt.
  • Die Einträge werden fortlaufend ab dem Index '1' nummeriert.
  • Dieser Sammlungstyp ist immer dicht; einzelne Array-Elemente können nicht gelöscht werden. Ein Varray kann entweder als Ganzes gelöscht oder am Ende gekürzt werden.
  • Da es immer dicht ist, besitzt es nur sehr geringe Flexibilität.
  • Dies ist sinnvoller, wenn die Größe des Arrays bekannt ist und ähnliche Aktionen auf alle Elemente angewendet werden.
  • Der Index und die Anzahl der Elemente in der Sammlung bleiben stets konstant.
  • Sie muss vor der Verwendung initialisiert werden. Jede Operation außer EXISTS auf einer nicht initialisierten Sammlung führt zu einem Fehler.
  • Es kann als Datenbankobjekt erstellt werden, das in der gesamten Datenbank sichtbar ist, oder innerhalb eines Unterprogramms, das nur dort verwendet wird.

Die folgende Abbildung veranschaulicht die Speicherbelegung eines Varray (dicht).

Index 1 2 3 4 5 6 7
Wert Xyz dfv Hrsg Cxs Vbc Nhu Qwe

Syntax für VARRAY:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • In der obigen Syntax wird type_name als VARRAY vom Typ 'DATA_TYPE' für die angegebene Größenbeschränkung deklariert. Der Datentyp kann einfach oder komplex sein.

Verschachtelte Tabellen

Eine verschachtelte Tabelle ist eine Sammlung, deren Arraygröße nicht festgelegt ist. Sie hat einen numerischen Index. Mehr zum Datentyp „verschachtelte Tabelle“:

  • Die verschachtelte Tabelle hat keine Größenbeschränkung.
  • Da die Obergrenze nicht festgelegt ist, muss der Speicher vor jeder Verwendung mit dem Schlüsselwort 'EXTEND' erweitert werden.
  • Die Einträge werden fortlaufend ab dem Index '1' nummeriert.
  • Dieser Sammlungstyp kann beides sein dicht und spärlichWir können es dicht packen und dann nach dem Zufallsprinzip einzelne Elemente löschen, wodurch es dünner wird.
  • Es bietet mehr Flexibilität beim Löschen von Array-Elementen.
  • Sie wird in einer systemgenerierten Datenbanktabelle gespeichert und kann in einer SELECT-Abfrage verwendet werden, um Werte abzurufen.
  • Index und Anzahl können variieren.
  • Sie muss vor der Verwendung initialisiert werden. Jede Operation außer EXISTS auf einer nicht initialisierten Sammlung führt zu einem Fehler.
  • Es kann als Datenbankobjekt erstellt werden, das in der gesamten Datenbank sichtbar ist, oder innerhalb eines Unterprogramms, das nur dort verwendet wird.

Die folgende Abbildung veranschaulicht die Speicherbelegung einer verschachtelten Tabelle (dicht und dünn besetzt). Ein leerer Speicherplatz kennzeichnet ein dünn besetztes Element.

Index 1 2 3 4 5 6 7
Wert (dicht) Xyz dfv Hrsg Cxs Vbc Nhu Qwe
Wert (dünn besetzt) Qwe Asd afg Asd Wer

Syntax für verschachtelte Tabelle:

TYPE <type_name> IS TABLE OF <DATA_TYPE>;
  • In der obigen Syntax wird type_name als verschachtelte Tabellensammlung vom Typ 'DATA_TYPE' deklariert. Der Datentyp kann einfach oder komplex sein.

Index nach Tabelle

Eine Indextabelle ist eine Sammlung, deren Arraygröße nicht festgelegt ist. Im Gegensatz zu anderen Sammlungstypen kann der Index einer Indextabelle vom Benutzer definiert werden. Die Attribute einer Indextabelle sind:

  • Der Index kann eine ganze Zahl oder eine Zeichenkette sein. Der Indextyp sollte beim Erstellen der Sammlung angegeben werden.
  • Diese Sammlungen werden nicht sequentiell gespeichert.
  • Sie sind von Natur aus immer spärlich.
  • Die Arraygröße ist nicht festgelegt.
  • Sie können nicht in einer Datenbankspalte gespeichert werden. Sie werden innerhalb einer bestimmten Sitzung erstellt und verwendet.
  • Sie bieten mehr Flexibilität bei der Beibehaltung des Index.
  • Die Indizes können eine negative Folge sein.
  • Sie eignen sich besser für relativ kleinere Sammlungswerte, die innerhalb desselben Unterprogramms verwendet werden.
  • Sie müssen vor der Verwendung nicht initialisiert werden.
  • Sie können nicht als Datenbankobjekt erstellt werden; sie werden nur innerhalb eines Unterprogramms erstellt.
  • BULK COLLECT kann bei diesem Sammlungstyp nicht verwendet werden, da der Index für jeden Datensatz explizit angegeben werden muss.

Die folgende Abbildung veranschaulicht die Speicherbelegung einer Indextabelle (dünnbesetzt). Ein leerer Speicherplatz kennzeichnet ein dünnbesetztes Element.

Tiefgestellt (varchar) ZUERST SECOND DRITTE VIERTE FÜNFTE Sechstes SIEBTE
Wert (dünn besetzt) Qwe Asd afg Asd Wer

Syntax für Index-by-Tabelle:

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • In der obigen Syntax wird type_name als indexbasierte Tabellensammlung vom Typ 'DATA_TYPE' deklariert. Die Indexvariable ist vom Typ VARCHAR2 mit einer maximalen Größe von 10.

Konstruktor- und Initialisierungskonzept in Sammlungen

Konstruktoren sind eingebaute Funktionen, die von Oracle die denselben Namen wie das Objekt oder die Sammlung haben. Sie werden immer dann zuerst ausgeführt, wenn in einer Sitzung zum ersten Mal auf ein Objekt oder eine Sammlung zugegriffen wird. Wichtige Details eines Konstruktors im Sammlungskontext:

  • Bei Sammlungen müssen diese Konstruktoren explizit aufgerufen werden, um die Sammlung zu initialisieren.
  • Sowohl Varray-Arrays als auch verschachtelte Tabellen müssen über diese Konstruktoren initialisiert werden, bevor sie im Programm verwendet werden können.
  • Ein Konstruktor erweitert implizit die Speicherzuweisung für eine Sammlung (außer Varray), sodass er auch Variablen der Sammlung zuweisen kann.
  • Die Zuweisung von Werten über Konstruktoren führt niemals zu einer dünn besetzten Sammlung.

Sammelmethoden

Oracle Es bietet zahlreiche Funktionen zur Bearbeitung und Verarbeitung von Sammlungen. Diese Funktionen bestimmen und ändern die verschiedenen Attribute einer Sammlung. Die folgende Tabelle enthält die verschiedenen Funktionen und ihre Beschreibungen.

Methodik Beschreibung Syntax
EXISTIERT (n) Gibt einen booleschen Wert zurück. Gibt TRUE zurück, wenn das n-te Element existiert, andernfalls FALSE. Nur EXISTS kann auf eine nicht initialisierte Sammlung angewendet werden. .EXISTS(element_position)
ANZAHL Gibt die Gesamtzahl der in einer Sammlung vorhandenen Elemente an. .ZÄHLEN
LIMIT Gibt die maximale Größe der Auflistung zurück. Für Varrays wird die feste Größe zurückgegeben; für verschachtelte und indizierte Tabellen wird NULL zurückgegeben. .GRENZE
ZUERST Gibt den Wert des ersten Index der Auflistung zurück. .ERSTE
LAST Gibt den Wert des letzten Index der Sammlung zurück. .ZULETZT
VOR (n) Gibt den vorhergehenden Index des n-ten Elements zurück. Falls keiner vorhanden ist, wird NULL zurückgegeben. .PRIOR(n)
WEITER (n) Gibt den Index des nachfolgenden Elements zurück. Falls keiner existiert, wird NULL zurückgegeben. .NEXT(n)
ERWEITERN Erweitert ein Element am Ende einer Sammlung. .VERLÄNGERN
ERWEITERN (n) Erweitert n Elemente am Ende einer Sammlung. .EXTEND(n)
ERWEITERN (n,i) Erweitert die Sammlung um n Kopien des i-ten Elements. .EXTEND(n,i)
TRIMMEN Entfernt ein Element vom Ende der Sammlung. .TRIMMEN
TRIM (n) Entfernt n Elemente vom Ende der Sammlung. .TRIM (n)
LÖSCHEN Löscht alle Elemente aus der Sammlung, sodass diese leer ist. .LÖSCHEN
LÖSCHEN (n) Löscht das n-te Element. Falls das n-te Element NULL ist, geschieht nichts. .DELETE(n)
LÖSCHEN (m,n) Löscht die Elemente im Bereich m bis n in der Sammlung. .DELETE(m,n)

Beispiel 1: Datensatztyp auf Unterprogrammebene

In diesem Beispiel sehen wir, wie man die Sammlung mit ' füllt.MASSENSAMMELN' und wie man auf die Sammlungsdaten verweist.

PL/SQL-Collection, die mit BULK COLLECT gefüllt wird (Beispiel)

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
TYPE emp_det_tbl IS TABLE OF emp_det;
guru99_emp_rec emp_det_tbl:= emp_det_tbl();
BEGIN
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,'AAA',25000,1000);
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX',10000,1000);
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,'ZZZ',7500,1000);
COMMIT;
SELECT emp_no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec
FROM emp;
dbms_output.put_line ('Employee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_output.put_line ('Employee Number: '||guru99_emp_rec(i).emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec(i).emp_name);
dbms_output.put_line ('Employee Salary:'|| guru99_emp_rec(i).salary);
dbms_output.put_line('Employee Manager Number:'||guru99_emp_rec(i).manager);
dbms_output.put_line('--------------------------------');
END LOOP;
END;
/

Code Erläuterung

  • Code Zeile 2-8: Aufnahmetyp 'emp_det' ist mit den Spalten emp_no, emp_name, manager und salary vom Datentyp NUMBER, VARCHAR2, NUMBER und NUMBER deklariert.
  • Code Zeile 9: Die Sammlung 'emp_det_tbl' vom Datensatztyp 'emp_det' wird erstellt.
  • Code Zeile 10: Die Variable 'guru99_emp_rec' wird als Typ 'emp_det_tbl' deklariert und mit einem Null-Konstruktor initialisiert.
  • Code Zeile 12-15: Einfügen der Beispieldaten in die Tabelle „emp“.
  • Code Zeile 16: Festschreiben der Einfügetransaktion.
  • Code Zeile 17: Die Datensätze aus der Tabelle „emp“ werden abgerufen und die Sammlungsvariable mithilfe von „BULK COLLECT“ in einem Schritt befüllt. Die Variable „guru99_emp_rec“ enthält nun alle in der Tabelle „emp“ vorhandenen Datensätze.
  • Code Zeile 19-26: Die 'FOR'-Schleife gibt alle Datensätze der Sammlung nacheinander aus. Die Sammlungsmethoden FIRST und LAST dienen als untere bzw. obere Grenze der Sammlung. Schleife.

Ausgang: Wenn der obige Code ausgeführt wird, erhalten Sie die folgende Ausgabe.

Employee Detail
Employee Number: 1000
Employee Name: AAA
Employee Salary: 25000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1002
Employee Name: YYY
Employee Salary: 15000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1003
Employee Name: ZZZ
Employee Salary: 7500
Employee Manager Number: 1000
----------------------------------------------

Häufig gestellte Fragen

Ein Varray hat eine feste maximale Größe und ist immer dicht belegt. Eine verschachtelte Tabelle hat keine Größenbeschränkung, kann dünnbesetzt sein und ist erweiterbar, wodurch sie flexibler für wachsende oder lückenhafte Daten ist.

Da es sich um ein assoziatives Array im Arbeitsspeicher und nicht um eine gespeicherte Tabelle handelt, dient der Index als Suchschlüssel. Daher funktionieren Zeichenketten oder negative Ganzzahlen, was für schlüsselbasierte Suchvorgänge innerhalb einer Sitzung nützlich ist.

Ein nicht initialisiertes Varray oder eine verschachtelte Tabelle ist atomar null, daher führt der Zugriff auf ein Element zu einem Fehler. Der Aufruf des Konstruktors allokiert den Speicher, anschließend können EXTEND und Zuweisungen Daten hinzufügen.

Ja. Abhängig davon, ob die Größe fest ist, ob die Daten gespeichert werden und ob ein String-Schlüssel benötigt wird, kann die KI auf ein Varray, eine verschachtelte Tabelle oder eine Index-by-Tabelle verweisen und den jeweiligen Kompromiss erläutern.

BULK COLLECT lädt alle Zeilen in einer einzigen Kontextumschaltung zwischen der SQL- und der PL/SQL-Engine in eine Sammlung, anstatt für jede Zeile eine Umschaltung durchzuführen, was den Aufwand bei großen Ergebnismengen erheblich reduziert.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: