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.