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:

In diesem Dokument werden nur die assoziativen Arrays erläutert.

Siehe:

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:

  1. Im deklarativen Teil:

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

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

    3. 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:

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:

  1. Fügen Sie am Ende des deklarativen Teils des Beispiels Beispiel 5-9 diese Variablendeklaration hinzu:

     i jobs.job_id%TYPE;
    
  2. 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.