Assoziative Arrays verwenden
Bei einem assoziativen Array handelt es sich um einen Collection-Typ.
Siehe:
Weitere Informationen zu Forderungseinzügen:
Informationen zu Sammlungen
Eine Collection ist eine zusammengesetzte PL/SQL-Variable, in der Elemente desselben Typs ähnlich wie bei einem eindimensionalen Array ähnlich in einer bestimmten Reihenfolge gespeichert sind. Die internen Komponenten einer Collection werden als Elemente bezeichnet. Jedes Element verfügt über ein individuelles untergeordnetes Skript, das seine Position in der Collection angibt.
Beim Zugriff auf ein Collection-Element wird die subscript notation verwendet: collection_name(element_subscript).
Collection-Elemente können wie skalare Variablen behandelt werden. Zudem können Sie komplette Collections als Unterprogrammparameter übergeben (sofern es sich weder beim Senden noch bei empfangenden Unterprogramm um ein eigenständiges Unterprogramm handelt).
Eine Collection-Methode ist ein integriertes PL/SQL-Unterprogramm, über das entweder Informationen zu einer Collection zurückgegeben oder eine Collection ausgeführt wird. Zum Aufrufen einer Collection-Methode wird Folgendes verwendet: Punktschreibweise: collection_name.method_name. Beispiel: Mit collection_name.COUNT wird die Anzahl der Elemente in der Collection abgerufen.
In PL/SQL gibt es drei Arten von Collections:
-
Assoziative Arrays (vormals als "PL/SQL-Tabellen" oder "Index-by-Tabellen" bezeichnet)
-
Verschachtelte Tabellen
-
Variablenarrays (Varrays)
In diesem Dokument werden nur die assoziativen Arrays erläutert.
Siehe:
-
Oracle Database PL/SQL-Sprachreferenz, um weitere Informationen zu PL/SQL-Collectionstypen zu erhalten
-
Oracle Database PL/SQL-Sprachreferenz für weitere Informationen zu Collection-Methoden
Informationen zu assoziativen Arrays
Ein assoziatives Array ist eine nicht gebundene Gruppe von Schlüssel-Wert-Paaren. Jeder Schlüssel ist eindeutig und dient als untergeordnetes Skript des Elements, das den entsprechenden Wert enthält. Somit können Sie auf Elemente zugreifen, ohne deren Positionen im Array zu kennen und ohne das Array zu durchlaufen.
Der Datentyp des Schlüssels kann entweder PLS_INTEGER oder VARCHAR2 (Länge) sein.
Wenn der Datentyp des Schlüssels PLS_INTEGER ist und das assoziative Array nach Ganzzahl indexiert ist und dicht besetzt ist (d.h. keine Lücken zwischen Elementen aufweist), ist jedes Element zwischen dem ersten und letzten Element definiert und hat einen Wert (der auch NULL sein kann).
If the key type is VARCHAR2 (length), the associative array is indexed by string (of length characters) and is sparse ; that is, it might have gaps between elements.
Beim Durchlaufen eines dicht besetzten assoziativen Arrays sollten Sie nicht darauf achten, dass die Elemente lückenhaft sind. Wenn Sie ein dünn besetzten assoziativen Arrays durchlaufen, müssen Sie dies tun.
Um einem assoziativen Arrayslement einen Wert zuzuweisen, können Sie einen Zuweisungsoperator verwenden:
array_name(key) := value
Wenn sich ein Schlüssel nicht im Array befindet, fügt die Zuweisungsanweisung das Schlüssel-Wert-Paar dem Array hinzu. Andernfalls ändert die Anweisung den Wert von array_name(key) in value.
Assoziative Arrays eignen sich zum temporären Speichern von Daten. Sie verwenden nicht den Plattenspeicherplatz oder die Netzwerkvorgänge, wie sie Tabellen benötigen. Da assoziative Arrays jedoch für die temporäre Speicherung bestimmt sind, können Sie sie nicht mit DML-Anweisungen bearbeiten.
Wenn Sie ein assoziatives Array in einem Package deklarieren und der Variable im Package Body Werte zuordnen, bleibt das assoziative Array während der Gültigkeitszeit der Datenbanksession bestehen. Andernfalls bleibt es während der Gültigkeitsdauer des Unterprogramms bestehen, in dem Sie es deklarieren.
Siehe auch: Oracle Database PL/SQL Language Reference, um weitere Informationen zu assoziativen Arrays zu erhalten
Assoziative Arrays deklarieren
Um ein assoziatives Array deklarieren, müssen Sie zunächst einen assoziativen Array-Typ deklarieren und dann eine Variable dieses Typs deklarieren.
Der folgende Code zeigt die einfachste Syntax:
TYPE array_type IS TABLE OF element_type INDEX BY key_type;
array_name array_type;
Eine effiziente Methode zum Deklarieren eines assoziativen Arrays erfolgt mit einem Cursor und der folgenden Vorgehensweise. Die Prozedur verwendet jede benötigte Anweisung in ihrer einfachsten Form, enthält jedoch Referenzen zu deren vollständiger Syntax.
So verwenden Sie einen Cursor zum Deklarieren eines assoziativen Arrays:
-
Im deklarativen Teil:
-
Deklarieren Sie den Cursor:
CURSOR cursor_name IS query;Informationen zur vollständigen Deklarationssyntax für expliziten Cursor finden Sie in der Oracle Database PL/SQL Language Reference.
-
Deklarieren Sie den assoziativen Array-Typ:
TYPE array_type IS TABLE OF cursor_name%ROWTYPE INDEX BY { PLS_INTEGER | VARCHAR2 length }Die vollständige Syntax zur Deklaration eines assoziativen Array-Typs finden Sie in derOracle Database PL/SQL Language Reference.
-
Deklarieren Sie eine assoziative Array-Variable dieses Typs:
array_name array_type;Die vollständige Syntax zum Deklarieren einer Variablen finden Sie in derOracle Database PL/SQL Language Reference.
-
Beispiel 5-9 verwendet das oben stehende Verfahren zum Deklarieren von zwei assoziativen Arrays, employees_jobs und jobs_, und deklariert anschließend ohne Verwendung eines Cursors ein drittes assoziatives Array, job_titles. Die ersten beiden Arrays sind nach Ganzzahlen indexiert, das dritte nach Zeichenfolgen.
Hinweis: Die Klausel ORDER BY in der Deklaration von employees_jobs_cursor bestimmt die Speicherreihenfolge der Elemente des assoziativen Arrays employee_jobs.
Beispiel 5-9: Assoziative Arrays deklarieren
DECLARE
-- Declare cursor:
CURSOR employees_jobs_cursor IS
SELECT FIRST_NAME, LAST_NAME, JOB_ID
FROM EMPLOYEES
ORDER BY JOB_ID, LAST_NAME, FIRST_NAME;
-- Declare associative array type:
TYPE employees_jobs_type IS TABLE OF employees_jobs_cursor%ROWTYPE
INDEX BY PLS_INTEGER;
-- Declare associative array:
employees_jobs employees_jobs_type;
-- Use same procedure to declare another associative array:
CURSOR jobs_cursor IS
SELECT JOB_ID, JOB_TITLE
FROM JOBS;
TYPE jobs_type IS TABLE OF jobs_cursor%ROWTYPE
INDEX BY PLS_INTEGER;
jobs_ jobs_type;
-- Declare associative array without using cursor:
TYPE job_titles_type IS TABLE OF JOBS.JOB_TITLE%TYPE
INDEX BY JOBS.JOB_ID%TYPE; -- jobs.job_id%type is varchar2(10)
job_titles job_titles_type;
BEGIN
NULL;
END;
/
Siehe:
-
Oracle Database PL/SQL Language Reference für Syntax der Deklaration assoziativer Arrays
Assoziative Arrays auffüllen
Die effizienteste Möglichkeit, ein dichtes assoziatives Array zu füllen, ist in der Regel eine SELECT-Anweisung mit einer BULK COLLECT INTO-Klausel.
Hinweis: Wenn ein dichtes assoziatives Array so groß ist, dass eine SELECT-Anweisung eine Ergebnismenge zurückgibt, die zu groß ist, um in den Speicher zu passen, verwenden Sie keine SELECT-Anweisung. Füllen Sie stattdessen das Array mit einem Cursor und die FETCH-Anweisung mit den Klauseln BULK COLLECT INTO und LIMIT. Informationen zur Verwendung der FETCH-Anweisung mit der BULK COLLECT INTO-Klausel finden Sie in der Oracle Database PL/SQL Language Reference.
Sie können eine SELECT-Anweisung nicht zum Auffüllen eines assoziativen Arrays mit geringer Häufigkeit verwenden (z.B. job_titles in "Assoziative Arrays deklarieren"). Sie müssen stattdessen eine Zuweisungsanweisung innerhalb einer Schleifenanweisung verwenden. Informationen zu Schleifenanweisungen finden Sie unter "Programmfluss steuern". Beispiel 5-10 verwendet SELECT-Anweisungen, um die assoziativen Arrays employees_jobs und jobs_ aufzufüllen, die nach Ganzzahl indexiert sind. Anschließend wird eine Zuweisungsanweisung innerhalb einer Anweisung FOR LOOP verwendet, um das assoziative Array job_titles aufzufüllen, das nach Zeichenfolge indexiert ist.
Beispiel 5-10: Assoziative Arrays auffüllen
-- Declarative part from Example 5-9 goes here.
BEGIN
-- Populate associative arrays indexed by integer:
SELECT FIRST_NAME, LAST_NAME, JOB_ID BULK COLLECT INTO employees_jobs
FROM EMPLOYEES ORDER BY JOB_ID, LAST_NAME, FIRST_NAME;
SELECT JOB_ID, JOB_TITLE BULK COLLECT INTO jobs_ FROM JOBS;
-- Populate associative array indexed by string:
FOR i IN 1..jobs_.COUNT() LOOP
job_titles(jobs_(i).job_id) := jobs_(i).job_title;
END LOOP;
END;
/
Siehe auch: "Informationen zu Cursors"
Dicht besetzte assoziative Arrays durchlaufen
Ein dicht besetztes assoziatives Array (durch Ganzzahlen indexiert) enthält keine Lücken zwischen den Elementen, d.h. jedes Element zwischen dem ersten und Dem letzten Element ist definiert und hat einen Wert (der auch NULL sein kann).
Sie können ein dichtes Array mit einer FOR LOOP-Anweisung durchlaufen, wie in Beispiel 5-11.
Beim Einfügen in den ausführbaren Teil von Beispiel 5-10 druckt die FOR LOOP-Anweisung in Beispiel 5-11 nach dem Code, der das employees_jobs-Array auffüllt, die Elemente des employees_jobs-Arrays in der Reihenfolge aus, in der sie gespeichert wurden. Die Reihenfolge der Speicherung wurde durch die ORDER BY-Klausel in der Deklaration von employees_jobs_cursor bestimmt, die zur Deklaration von employees_jobs verwendet wurde (siehe Beispiel 5-9).
Der obere Grenzwert der FOR LOOP-Anweisung, employees_jobs.COUNT, ruft eine Erfassungsmethode, welche die Anzahl der Elemente im Array zurückgibt, auf. Weitere Informationen zu COUNT finden Sie in Oracle Database PL/SQL Language Reference.
Beispiel 5-11: Durchlaufen eines dicht besetzten assoziativen Arrays
-- Code that populates employees_jobs must precede this code:
FOR i IN 1..employees_jobs.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(
RPAD(employees_jobs(i).first_name, 23) ||
RPAD(employees_jobs(i).last_name, 28) || employees_jobs(i).job_id);
END LOOP;
Ergebnis:
William Gietz AC_ACCOUNT
Shelley Higgins AC_MGR
Jennifer Whalen AD_ASST
Steven King AD_PRES
Lex De Haan AD_VP
Neena Kochhar AD_VP
John Chen FI_ACCOUNT
...
Jose Manuel Urman FI_ACCOUNT
Nancy Greenberg FI_MGR
Susan Mavris HR_REP
David Austin IT_PROG
...
Valli Pataballa IT_PROG
Michael Hartstein MK_MAN
Pat Fay MK_REP
Hermann Baer PR_REP
Shelli Baida PU_CLERK
...
Sigal Tobias PU_CLERK
Den Raphaely PU_MAN
Gerald Cambrault SA_MAN
...
Eleni Zlotkey SA_MAN
Ellen Abel SA_REP
...
Clara Vishney SA_REP
Sarah Bell SH_CLERK
...
Peter Vargas ST_CLERK
Adam Fripp ST_MAN
...
Matthew Weiss ST_MAN
Dünn besetzte assoziative Arrays durchlaufen
In einem dünn besetzten assoziativen Array (nach Zeichenfolge indexiert) können Lücken zwischen den Elementen auftreten.
Sie können sie mit einer WHILE LOOP-Anweisung durchlaufen, wie in Beispiel 5-12.
Gehen Sie folgendermaßen vor, um den Code in Beispiel 5-12 auszuführen, in dem die Elemente des job_titles-Arrays gedruckt werden:
-
Fügen Sie am Ende des deklarativen Teils des Beispiels Beispiel 5-9 diese Variablendeklaration hinzu:
i jobs.job_id%TYPE; -
Fügen Sie in dem ausführbaren Teil von Beispiel 5-10 nach dem Code, der in das Array job_titles eingetragen ist, den Code aus Beispiel 5-12 ein.
Beispiel 5-12: Dünn besetztes assoziatives Array durchlaufen
/* Declare this variable in declarative part:
i jobs.job_id%TYPE;
Add this code to the executable part,
after code that populates job_titles:
*/
i := job_titles.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(RPAD(i, 12) || job_titles(i));
i := job_titles.NEXT(i);
END LOOP;
Ergebnis:
AC_ACCOUNT Public Accountant
AC_MGR Accounting Manager
AD_ASST Administration Assistant
AD_PRES President
AD_VP Administration Vice President
FI_ACCOUNT Accountant
FI_MGR Finance Manager
HR_REP Human Resources Representative
IT_PROG Programmer
MK_MAN Marketing Manager
MK_REP Marketing Representative
PR_REP Public Relations Representative
PU_CLERK Purchasing Clerk
PU_MAN Purchasing Manager
SA_MAN Sales Manager
SA_REP Sales Representative
SH_CLERK Shipping Clerk
ST_CLERK Stock Clerk
ST_MAN Stock Manager
Beispiel 5-12 enthält zwei Aufrufe der Collection-Methode: job_titles.FIRST und job_titles.NEXT(i). job_titles.FIRST gibt das erste Element von job_titles zurück, und job_titles.NEXT(i) gibt das untergeordnete Element zurück, das nach i folgt. Weitere Informationen zu FIRST finden Sie in Oracle Database PL/SQL Language Reference. Weitere Informationen zu NEXT finden Sie in Oracle Database PL/SQL Language Reference.