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.

Datensatztyp auf Unterprogrammebene

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

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: