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.

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.
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 ----------------------------------------------

