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


