PL / SQL - Sammlungen
In diesem Kapitel werden die Sammlungen in PL / SQL erläutert. Eine Sammlung ist eine geordnete Gruppe von Elementen mit demselben Datentyp. Jedes Element wird durch einen eindeutigen Index identifiziert, der seine Position in der Sammlung darstellt.
PL / SQL bietet drei Sammlungstypen:
- Index-by-Tabellen oder assoziatives Array
- Verschachtelte Tabelle
- Array mit variabler Größe oder Varray
Die Oracle-Dokumentation bietet die folgenden Merkmale für jeden Sammlungstyp:
Sammlungsart | Anzahl der Elemente | Indexart | Dicht oder spärlich | Wo erstellt | Kann ein Objekttypattribut sein |
---|---|---|---|---|---|
Assoziatives Array (oder Index-by-Tabelle) | Ungebunden | Zeichenfolge oder Ganzzahl | Entweder | Nur im PL / SQL-Block | Nein |
Verschachtelte Tabelle | Ungebunden | Ganze Zahl | Fängt dicht an, kann spärlich werden | Entweder im PL / SQL-Block oder auf Schemaebene | Ja |
Array mit variabler Größe (Varray) | Eingeschränkt | Ganze Zahl | Immer dicht | Entweder im PL / SQL-Block oder auf Schemaebene | Ja |
Wir haben Varray bereits in diesem Kapitel besprochen 'PL/SQL arrays'. In diesem Kapitel werden die PL / SQL-Tabellen erläutert.
Beide Arten von PL / SQL-Tabellen, dh die Index-by-Tabellen und die verschachtelten Tabellen, haben dieselbe Struktur und auf ihre Zeilen wird mit der tiefgestellten Notation zugegriffen. Diese beiden Arten von Tabellen unterscheiden sich jedoch in einem Aspekt. Die verschachtelten Tabellen können in einer Datenbankspalte gespeichert werden und die Index-by-Tabellen nicht.
Index-By-Tabelle
Ein index-by Tabelle (auch als associative array) ist eine Menge von key-valuePaare. Jeder Schlüssel ist eindeutig und wird verwendet, um den entsprechenden Wert zu lokalisieren. Der Schlüssel kann entweder eine Ganzzahl oder eine Zeichenfolge sein.
Eine Index-by-Tabelle wird mit der folgenden Syntax erstellt. Hier schaffen wir eineindex-by Tabelle benannt table_name, deren Schlüssel vom Typ subscript_type und die zugehörigen Werte vom Typ element_type sind
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;
table_name type_name;
Beispiel
Das folgende Beispiel zeigt, wie Sie eine Tabelle zum Speichern von Ganzzahlwerten zusammen mit Namen erstellen und später dieselbe Liste von Namen drucken.
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000;
salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000;
salary_list('James') := 78000;
-- printing the table
name := salary_list.FIRST;
WHILE name IS NOT null LOOP
dbms_output.put_line
('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/
Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:
Salary of James is 78000
Salary of Martin is 100000
Salary of Minakshi is 75000
Salary of Rajnish is 62000
PL/SQL procedure successfully completed.
Beispiel
Elemente einer Index-by-Tabelle können auch a sein %ROWTYPE einer beliebigen Datenbanktabelle oder %TYPEeines beliebigen Datenbanktabellenfeldes. Das folgende Beispiel veranschaulicht das Konzept. Wir werden die verwendenCUSTOMERS Tabelle in unserer Datenbank gespeichert als -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
select name from customers;
TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer;
name_list c_list;
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter));
END LOOP;
END;
/
Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed
Verschachtelte Tabellen
EIN nested tableist wie ein eindimensionales Array mit einer beliebigen Anzahl von Elementen. Eine verschachtelte Tabelle unterscheidet sich jedoch in folgenden Aspekten von einem Array:
Ein Array hat eine deklarierte Anzahl von Elementen, eine verschachtelte Tabelle jedoch nicht. Die Größe einer verschachtelten Tabelle kann sich dynamisch erhöhen.
Ein Array ist immer dicht, dh es hat immer aufeinanderfolgende Indizes. Ein verschachteltes Array ist anfangs dicht, kann jedoch spärlich werden, wenn Elemente daraus gelöscht werden.
Eine verschachtelte Tabelle wird mit der folgenden Syntax erstellt:
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
Diese Erklärung ähnelt der Erklärung von a index-by Tisch, aber es gibt keine INDEX BY Klausel.
Eine verschachtelte Tabelle kann in einer Datenbankspalte gespeichert werden. Es kann außerdem zur Vereinfachung von SQL-Vorgängen verwendet werden, bei denen Sie eine einspaltige Tabelle mit einer größeren Tabelle verbinden. Ein assoziatives Array kann nicht in der Datenbank gespeichert werden.
Beispiel
Die folgenden Beispiele veranschaulichen die Verwendung verschachtelter Tabellen -
DECLARE
TYPE names_table IS TABLE OF VARCHAR2(10);
TYPE grades IS TABLE OF INTEGER;
names names_table;
marks grades;
total integer;
BEGIN
names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i IN 1 .. total LOOP
dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
end loop;
END;
/
Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:
Total 5 Students
Student:Kavita, Marks:98
Student:Pritam, Marks:97
Student:Ayan, Marks:78
Student:Rishav, Marks:87
Student:Aziz, Marks:92
PL/SQL procedure successfully completed.
Beispiel
Elemente von a nested table kann auch ein sein %ROWTYPEeiner beliebigen Datenbanktabelle oder% TYPE eines beliebigen Datenbanktabellenfeldes. Das folgende Beispiel veranschaulicht das Konzept. Wir verwenden die in unserer Datenbank gespeicherte Tabelle CUSTOMERS als -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list IS TABLE of customerS.No.ame%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
Sammelmethoden
PL / SQL bietet die integrierten Erfassungsmethoden, die die Verwendung von Sammlungen vereinfachen. In der folgenden Tabelle sind die Methoden und ihr Zweck aufgeführt:
S.No. | Methodenname & Zweck |
---|---|
1 | EXISTS(n) Gibt TRUE zurück, wenn das n-te Element in einer Sammlung vorhanden ist. Andernfalls wird FALSE zurückgegeben. |
2 | COUNT Gibt die Anzahl der Elemente zurück, die eine Sammlung derzeit enthält. |
3 | LIMIT Überprüft die maximale Größe einer Sammlung. |
4 | FIRST Gibt die ersten (kleinsten) Indexnummern in einer Sammlung zurück, die die ganzzahligen Indizes verwendet. |
5 | LAST Gibt die letzten (größten) Indexnummern in einer Sammlung zurück, die die ganzzahligen Indizes verwendet. |
6 | PRIOR(n) Gibt die Indexnummer vor Index n in einer Sammlung zurück. |
7 | NEXT(n) Gibt die Indexnummer zurück, die auf Index n folgt. |
8 | EXTEND Hängt ein Nullelement an eine Sammlung an. |
9 | EXTEND(n) Hängt n Nullelemente an eine Sammlung an. |
10 | EXTEND(n,i) Hängt an nKopien des i- ten Elements zu einer Sammlung. |
11 | TRIM Entfernt ein Element vom Ende einer Sammlung. |
12 | TRIM(n) Entfernt n Elemente aus dem Ende einer Sammlung. |
13 | DELETE Entfernt alle Elemente aus einer Sammlung und setzt COUNT auf 0. |
14 | DELETE(n) Entfernt die nthElement aus einem assoziativen Array mit einem numerischen Schlüssel oder einer verschachtelten Tabelle. Wenn das assoziative Array einen Zeichenfolgenschlüssel hat, wird das dem Schlüsselwert entsprechende Element gelöscht. Wennn ist Null, DELETE(n) tut nichts. |
15 | DELETE(m,n) Entfernt alle Elemente im Bereich m..naus einem assoziativen Array oder einer verschachtelten Tabelle. Wennm ist größer als n oder wenn m oder n ist Null, DELETE(m,n) tut nichts. |
Sammlungsausnahmen
Die folgende Tabelle enthält die Sammlungsausnahmen und wann sie ausgelöst werden -
Sammlungsausnahme | In Situationen aufgewachsen |
---|---|
COLLECTION_IS_NULL | Sie versuchen, eine atomar null Sammlung zu bearbeiten. |
KEINE DATEN GEFUNDEN | Ein Index bezeichnet ein Element, das gelöscht wurde, oder ein nicht vorhandenes Element eines assoziativen Arrays. |
SUBSCRIPT_BEYOND_COUNT | Ein Index überschreitet die Anzahl der Elemente in einer Sammlung. |
SUBSCRIPT_OUTSIDE_LIMIT | Ein Index liegt außerhalb des zulässigen Bereichs. |
VALUE_ERROR | Ein Index ist null oder nicht in den Schlüsseltyp konvertierbar. Diese Ausnahme kann auftreten, wenn der Schlüssel als definiert istPLS_INTEGER Bereich, und der Index liegt außerhalb dieses Bereichs. |