Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zweck der Verwendung verschiedener Arten von PL/SQL-Sammlungen in Oracle

Beginnen wir mit Nested Tables, sie sind die häufigste Form der Sammlung und stellen somit eine nützliche Vergleichsgrundlage dar.

Eine verschachtelte Tabelle ist eine Variable, die mehr als eine Instanz von etwas enthalten kann, oft einen Datensatz aus einer Datenbanktabelle. Sie könnten wie folgt deklariert werden:

type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;

Sie sind nützlich, wenn wir mehrere Dateninstanzen speichern möchten, für die wir dasselbe tun möchten. Das klassische Beispiel ist die Verwendung von BULK COLLECT zum Speichern mehrerer Datensätze:

select * 
bulk collect into emp_rec_nt
from employees;

Dies gibt uns eine Datenquelle, die wir umrunden können; Entscheidend ist, dass wir sowohl rückwärts als auch vorwärts navigieren und sogar zum Ende oder Anfang springen können, was wir mit einem Cursor nicht tun können. Verschachtelte Tabellen können Sammlungen beliebiger Datentypen sein, einschließlich zusammengesetzter Daten wie PL/SQL-Datensätze oder benutzerdefinierter Typen.

Eine Index By-Tabelle wird besser (wie in der Dokumentation) als Associative Array bezeichnet. Dies sind einfache Sammlungen einzelner Attribute mit Index. Verschachtelte Tabellen haben auch Indizes, aber ihre Indizes sind nur Zeilenzahlen. Bei einem assoziativen Array kann der Index aussagekräftig sein, d. h. aus einem Datenwert stammen. Daher sind sie nützlich, um Datenwerte für die spätere Verwendung zwischenzuspeichern. Der Index kann eine Zahl oder (seit 9iR2) ein String sein, was sehr nützlich sein kann. Hier ist zum Beispiel ein assoziatives Array von Gehältern, das durch die Mitarbeiterkennung indiziert ist.

type emp_sal_aa is table of emp.sql%type
     index by emp.empno%type;
l_emp_sales emp_sal_aa;

Beachten Sie, dass ich dieses Array mit INDEX BY BINARY_INTEGER hätte deklarieren können, aber es ist klarer, stattdessen die %TYPE-Syntax zu verwenden (selbstdokumentierender Code). Elemente dieses Arrays können durch einen Indexwert identifiziert werden, in diesem Fall EMPNO:

l_emp_sals(l_emp_no) := l_emp_sal;

Abgesehen vom Zwischenspeichern von Referenztabellen oder ähnlichen Nachschlagewerten gibt es nicht viele Anwendungsfälle für assoziative Arrays.

Variablen-Arrays sind nur verschachtelte Tabellen mit einer vordefinierten Begrenzung der Anzahl von Elementen. Vielleicht ist der Name also irreführend:Es handelt sich tatsächlich um feste Arrays. Es gibt wenig, was wir mit VArrays tun können, was wir mit verschachtelten Tabellen nicht tun könnten (außer die Anzahl der Elemente einschränken, und es ist ziemlich selten, dass wir das tun möchten). Sie werden wie folgt deklariert:

type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;

Wir können Bulk Collect verwenden, um ein VArray zu füllen ...

select * 
bulk collect into emp_rec_va
from employees;

Wir müssen jedoch sicher sein, dass die Abfrage höchstens zurückgibt die Anzahl der Elemente, die in der VArray-Deklaration angegeben sind. Andernfalls schleudert die SELECT ORA-22165.

Es sind keine Anwendungsfälle für Variablen-Arrays bekannt. Okay, das ist ein bisschen hart, aber fast immer werden Sie stattdessen verschachtelte Tabellen verwenden. Der einzige große Vorteil von VArrays gegenüber verschachtelten Tabellen besteht darin, dass sie die Reihenfolge der Elemente garantieren. Wenn Sie also Elemente in der gleichen Reihenfolge herausholen müssen, in der Sie sie eingefügt haben, verwenden Sie ein VArray.

Die PL/SQL-Dokumentation widmet Collections ein ganzes Kapitel. Erfahren Sie mehr.