Oracle PL/SQL-Sammlungen: Varrays, verschachtelt und Index nach Tabellen
Was ist Sammlung?
Eine Sammlung ist eine geordnete Gruppe von Elementen bestimmter Datentypen. Es kann sich um eine Sammlung einfacher oder komplexer Datentypen (wie benutzerdefinierter oder Datensatztypen) handeln.
In der Sammlung wird jedes Element durch einen Begriff namens identifiziert "Index." Jedem Element in der Sammlung wird ein eindeutiger Index zugewiesen. Die Daten in dieser Sammlung kรถnnen durch Verweis auf diesen eindeutigen Index manipuliert oder abgerufen werden.
Sammlungen sind รคuรerst nรผtzlich, wenn groรe Datenmengen desselben Typs verarbeitet oder manipuliert werden mรผssen. Sammlungen kรถnnen mit der Option โBULKโ als Ganzes gefรผllt und bearbeitet werden Oracle.
Sammlungen werden basierend auf der Struktur, dem Index und der Speicherung klassifiziert, wie unten gezeigt.
- Index-by-Tables (auch bekannt als Assoziatives Array)
- Verschachtelte Tabellen
- Varrays
Zu jedem Zeitpunkt kรถnnen Daten in der Sammlung durch drei Begriffe bezeichnet werden: Sammlungsname, Index, Feld-/Spaltenname als โ ( ). โ. Im folgenden Abschnitt erfahren Sie mehr รผber diese oben genannten Sammlungskategorien.
Varrays
Varray ist eine Sammlungsmethode, bei der die Grรถรe des Arrays festgelegt ist. Die Array-Grรถรe kann ihren festgelegten Wert nicht รผberschreiten. Der Index des Varrays ist ein numerischer Wert. Im Folgenden sind die Attribute von Varrays aufgefรผhrt.
- Die Obergrenze fรผr die Grรถรe ist festgelegt
- Wird nacheinander beginnend mit dem Index โ1โ ausgefรผllt.
- Dieser Sammlungstyp ist immer dicht, dh wir kรถnnen keine Array-Elemente lรถschen. Varray kann als Ganzes gelรถscht oder am Ende gekรผrzt werden.
- Da es von Natur aus immer dicht ist, weist es eine sehr geringe Flexibilitรคt auf.
- Die Verwendung ist sinnvoller, wenn die Array-Grรถรe bekannt ist und รคhnliche Aktivitรคten fรผr alle Array-Elemente ausgefรผhrt werden.
- Der Index und die Reihenfolge bleiben immer stabil, dh der Index und die Anzahl der Sammlung sind immer gleich.
- Sie mรผssen initialisiert werden, bevor sie in Programmen verwendet werden kรถnnen. Jeder Vorgang (auรer EXISTS-Vorgรคngen) an einer nicht initialisierten Sammlung fรผhrt zu einem Fehler.
- Es kann als Datenbankobjekt erstellt werden, das in der gesamten Datenbank sichtbar ist, oder innerhalb des Unterprogramms, das nur in diesem Unterprogramm verwendet werden kann.
Die folgende Abbildung erlรคutert schematisch die Speicherzuweisung von 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 entweder ein einfacher oder ein komplexer Typ sein.
Verschachtelte Tabellen
Eine verschachtelte Tabelle ist eine Sammlung, in der die Grรถรe des Arrays nicht festgelegt ist. Es hat den numerischen Indextyp. Nachfolgend finden Sie weitere Beschreibungen zum Typ verschachtelter Tabellen.
- Fรผr die verschachtelte Tabelle gibt es keine obere Grรถรenbeschrรคnkung.
- Da die obere Grรถรenbeschrรคnkung nicht festgelegt ist, muss der Sammlungsspeicher jedes Mal erweitert werden, bevor wir ihn verwenden. Wir kรถnnen die Sammlung mit dem Schlรผsselwort โEXTENDโ erweitern.
- Wird nacheinander beginnend mit dem Index โ1โ ausgefรผllt.
- Dieser Sammlungstyp kann beides sein dicht und spรคrlichDas heiรt, wir kรถnnen die Sammlung als dicht besetzen erstellen und das einzelne Array-Element auch nach dem Zufallsprinzip lรถschen, wodurch es dรผnn besetzt wird.
- Es bietet mehr Flexibilitรคt beim Lรถschen des Array-Elements.
- Es wird in der vom System generierten Datenbanktabelle gespeichert und kann in der Auswahlabfrage zum Abrufen der Werte verwendet werden.
- Der Index und die Reihenfolge sind nicht stabil, dh der Index und die Anzahl der Array-Elemente kรถnnen variieren.
- Sie mรผssen initialisiert werden, bevor sie in Programmen verwendet werden kรถnnen. Jeder Vorgang (auรer EXISTS-Vorgรคngen) an der nicht initialisierten Sammlung fรผhrt zu einem Fehler.
- Es kann als Datenbankobjekt erstellt werden, das in der gesamten Datenbank sichtbar ist, oder innerhalb des Unterprogramms, das nur in diesem Unterprogramm verwendet werden kann.
Die folgende Abbildung erlรคutert schematisch die Speicherzuweisung von Nested Table (dicht und dรผnn besetzt). Der schwarz gefรคrbte Elementraum bezeichnet das leere Element in einer Sammlung, dh spรคrlich.
| Index | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Wert (dicht) | Xyz | dfv | Hrsg | Cxs | Vbc | Nhu | Qwe |
| Wert (spรคrlich) | Qwe | Asd | afg | Asd | Wer |
Syntax fรผr verschachtelte Tabelle:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- In der obigen Syntax wird type_name als verschachtelte Tabellensammlung vom Typ โDATA_TYPEโ deklariert. Der Datentyp kann entweder ein einfacher oder ein komplexer Typ sein.
Index nach Tabelle
Index-by-Table ist eine Sammlung, bei der die Array-Grรถรe nicht festgelegt ist. Im Gegensatz zu den anderen Sammlungstypen kann der Index-by-Table-Auflistung vom Benutzer definiert werden. Im Folgenden sind die Attribute von Index-by-Table aufgefรผhrt.
- Der Index kann eine Ganzzahl oder Zeichenfolgen sein. Zum Zeitpunkt der Erstellung der Sammlung sollte der Indextyp 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 der Datenbankspalte gespeichert werden. Sie mรผssen in jedem Programm in dieser bestimmten Sitzung erstellt und verwendet werden.
- Sie bieten mehr Flexibilitรคt bei der Beibehaltung des Index.
- Die Indizes kรถnnen auch eine negative Indexfolge haben.
- Sie eignen sich eher fรผr relativ kleinere Sammelwerte, bei denen die Sammlung initialisiert und innerhalb derselben Unterprogramme verwendet werden kann.
- Sie mรผssen vor der Verwendung nicht initialisiert werden.
- Es kann nicht als Datenbankobjekt erstellt werden. Es kann nur innerhalb des Unterprogramms erstellt werden und kann nur in diesem Unterprogramm verwendet werden.
- BULK COLLECT kann in diesem Sammlungstyp nicht verwendet werden, da der Index explizit fรผr jeden Datensatz in der Sammlung angegeben werden sollte.
Die folgende Abbildung erlรคutert schematisch die Speicherzuordnung von Nested Table (sparse). Der schwarz gefรคrbte Elementraum bezeichnet das leere Element in einer Sammlung, dh spรคrlich.
| Tiefgestellt (varchar) | ZUERST | SECOND | DRITTE | VIERTE | FรNFTE | Sechstes | SIEBTE |
| Wert (spรคrlich) | Qwe | Asd | afg | Asd | Wer |
Syntax fรผr Index-by-Table
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- In der obigen Syntax wird type_name als indexierte Tabellensammlung des Typs โDATA_TYPEโ deklariert. Der Datentyp kann entweder einfach oder komplex sein. Die Subskript-/Indexvariable wird als VARCHAR2-Typ mit einer maximalen Grรถรe von 10 angegeben.
Konstruktor- und Initialisierungskonzept in Sammlungen
Konstruktoren sind die integrierten Funktionen des Orakels, die denselben Namen wie das Objekt oder die Sammlungen haben. Sie werden zuerst ausgefรผhrt, wenn Objekte oder Sammlungen zum ersten Mal in einer Sitzung referenziert werden. Nachfolgend finden Sie die wichtigen Details des Konstruktors im Sammlungskontext:
- Bei Sammlungen sollten diese Konstruktoren explizit aufgerufen werden, um sie zu initialisieren.
- Sowohl Varray- als auch Nested-Tabellen mรผssen รผber diese Konstruktoren initialisiert werden, bevor sie in das Programm verwiesen werden.
- Der Konstruktor erweitert implizit die Speicherzuweisung fรผr eine Sammlung (auรer Varray), daher kann der Konstruktor die Variablen auch den Sammlungen zuweisen.
- Das Zuweisen von Werten zur Sammlung รผber Konstruktoren fรผhrt niemals dazu, dass die Sammlung dรผnn besetzt wird.
Sammelmethoden
Oracle bietet viele Funktionen zum Bearbeiten und Arbeiten mit den Sammlungen. Diese Funktionen sind im Programm sehr nรผtzlich, um die verschiedenen Attribute der Sammlungen zu bestimmen und zu รคndern. Die folgende Tabelle enthรคlt die verschiedenen Funktionen und ihre Beschreibung.
| Methodik | Beschreibung | SYNTAX |
|---|---|---|
| EXISTIERT (n) | Diese Methode gibt boolesche Ergebnisse zurรผck. Es wird โTRUEโ zurรผckgegeben, wenn das nth Das Element existiert in dieser Sammlung, andernfalls wird FALSE zurรผckgegeben. In einer nicht initialisierten Sammlung kรถnnen nur EXISTS-Funktionen verwendet werden | .EXISTS(element_position) |
| ANZAHL | Gibt die Gesamtzahl der in einer Sammlung vorhandenen Elemente an | .ZรHLEN |
| LIMIT | Es gibt die maximale Grรถรe der Sammlung zurรผck. Fรผr Varray wird die definierte feste Grรถรe zurรผckgegeben. Fรผr verschachtelte Tabellen und Index-by-Table wird NULL ausgegeben | .GRENZE |
| ZUERST | Gibt den Wert der ersten Indexvariablen (Index) der Sammlungen zurรผck | .ERSTE |
| LAST | Gibt den Wert der letzten Indexvariablen (Index) der Sammlungen zurรผck | .ZULETZT |
| VOR (n) | Gibt die Indexvariable in einer Sammlung von n voranth Element. Wenn kein vorangehender Indexwert vorhanden ist, wird NULL zurรผckgegeben | .PRIOR(n) |
| WEITER (n) | Gibt die erfolgreiche Indexvariable in einer Sammlung von n zurรผckth Element. Wenn kein erfolgreicher Indexwert vorhanden ist, wird NULL zurรผckgegeben | .NEXT(n) |
| ERWEITERN | Erweitert am Ende ein Element in einer Sammlung | .VERLรNGERN |
| ERWEITERN (n) | Erweitert n Elemente am Ende einer Sammlung | .EXTEND(n) |
| ERWEITERN (n,i) | Erweitert n Kopien des ith Element am Ende der Sammlung | .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. Macht die Sammlung leer | .LรSCHEN |
| LรSCHEN (n) | Lรถscht das n-te Element aus der Sammlung. Wenn, dannth Element NULL ist, wird dies nichts bewirken | .DELETE(n) |
| LรSCHEN (m,n) | Lรถscht das Element im Bereich mth bis nth in der Sammlung | .DELETE(m,n) |
Beispiel 1: Datensatztyp auf Unterprogrammebene
In diesem Beispiel werden wir sehen, 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-Erklรคrung:
- Codezeile 2-8: Aufnahmetyp โemp_detโ wird mit den Spalten โempf_noโ, โem_nameโ, โsalaryโ und โmanagerโ vom Datentyp NUMBER, VARCHAR2, NUMBER, NUMBER deklariert.
- Codezeile 9: Erstellen der Sammlung โemp_det_tblโ des Datensatztypelements โemp_detโ
- Codezeile 10: Deklarieren Sie die Variable โguru99_emp_recโ als Typ โemp_det_tblโ und initialisieren Sie sie mit einem Nullkonstruktor.
- Codezeile 12-15: Einfรผgen der Beispieldaten in die Tabelle โempโ.
- Codezeile 16: Festschreiben der Einfรผgetransaktion.
- Codezeile 17: Abrufen der Datensรคtze aus der Tabelle โempโ und Fรผllen der Sammlungsvariablen als Bulk mit dem Befehl โBULK COLLECTโ. Jetzt enthรคlt die Variable โguru99_emp_recโ alle Datensรคtze, die in der Tabelle โempโ vorhanden sind.
- Codezeile 19-26: Setzen Sie die โFORโ-Schleife, um alle Datensรคtze in der Sammlung einzeln zu drucken. Als untere und obere Grenze wird die Erhebungsmethode FIRST und LAST verwendet Schleife.
Ausgang: Wie Sie im obigen Screenshot sehen kรถnnen, erhalten Sie bei Ausfรผhrung des obigen Codes 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 ----------------------------------------------

