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: