Application Express "Collections"

Application Express Collections dienen dazu, eine Sammlung von Datensätzen bzw. Werten in der Session zu speichern. Während für skalare Werte wie VARCHAR2, NUMBER oder DATE die normalen Application Express-Elemente vorgesehen sind, dienen Collections der temporären Speicherung von nicht-skalaren Werten. Wichtig ist, dass Inhalte einer Collection nur für die jeweilige Application Express-Session sichtbar sind und nach Beendigung der Session zerstört werden. Die Implementierung des Einkaufskorbes in einer Shop-Applikation ist ein typisches Anwendungsbeispiel.

Collections kommen stets dann zum Einsatz, wenn eine Sammlung von Sätzen über mehrere Application Express-Seiten gepflegt und erst zum Schluß in die Datenbank-Tabellen gespeichert werden soll. Im folgenden wird der Umgang mit Collections näher beschrieben. Ausgangspunkt ist dabei eine leere Anwendungsseite:

Eine Collection erzeugen

Das folgende Codebeispiel legt eine Collection an. Dies geschieht typischerweise pro Session ein Mal. Erzeugen Sie also auf Ihrer Anwendungsseite eine Collection mit folgendem Anwendungsprozeß:

Erstellen eines Anwendungsprozesses (Beim Laden: Vor Header)

Abb.1: Erstellen eines Anwendungsprozesses (Beim Laden: Vor Header)

begin
  if not apex_collection.collection_exists('TEST_COLLECTION') then 
    apex_collection.create_collection('TEST_COLLECTION');
  end if;
end;

Inhalte der Collection anzeigen ...

Als nächstes sollen die Inhalte der Collection dargestellt werden. Dazu wird nun ein Bericht erzeugt. Zum Zugriff auf die Collection steht Ihnen die View APEX_COLLECTIONS zur Verfügung.

Anzeigen der Collection: Erstellen eines Berichtes

Abb. 2: Anzeigen der Collection: Erstellen eines Berichtes

Wenn Sie die Seite nun neu starten, ist der Bericht natürlich leer - die Collection hat noch keine Inhalte. Dies ändert sich mit dem nächsten Schritt. Erzeugen Sie auf Ihrer Anwendungsseite ...

  • Eine weitere Region vom Typ HTML
  • Ein ausgeblendetes Element PX_SEQNR
  • Drei Textelemente: PX_DATUM, PX_NAME und PX_UMSATZ
  • Eine Schaltfläche Speichern

Das Ergebnis sollte in etwa wie in Abbildung 3 aussehen.

Anwendungsseite mit Formularelementen

Abb. 3: Anwendungsseite mit Formularelementen

Inhalte der Collection bearbeiten

Bei Klick auf die Schaltfläche Speichern sollen die Eingaben in der Collection gespeichert werden. Erzeugen Sie dazu einen PL/SQL-Anwendungsprozeß wie in Abbildung 4 dargestellt.

PL/SQL-Prozess zum Speichern der Eingeben in die Collection

Abb. 4: PL/SQL-Prozess zum Speichern der Eingaben in die Collection

if :P1_SEQNR is null then 
  apex_collection.add_member(
    p_collection_name => 'TEST_COLLECTION',
    p_c001 =>            :P1_DATUM,
    p_c002 =>            :P1_NAME,
    p_c003 =>            :P1_UMSATZ
  );
else 
  apex_collection.update_member(
    p_collection_name => 'TEST_COLLECTION',
    p_seq  =>            :P1_SEQNR,
    p_c001 =>            :P1_DATUM,
    p_c002 =>            :P1_NAME,
    p_c003 =>            :P1_UMSATZ
  );
end if;

Testen Sie das Formular nun mit einigen Eingaben. Sie werden feststellen, dass Bericht und Formular reagieren, als ob sie auf Basis einer normalen Tabelle angelegt wurden.

Vorläufiges Ergebnis: Bericht und Formular mit Collection-Inhalten

Abb. 5: Vorläufiges Ergebnis: Bericht und Formular mit Collection-Inhalten

Den Unterschied bemerken Sie jedoch, wenn Sie die Seite mit einem anderen Browser aufrufen oder die Session-ID aus der URL entfernen. In diesem Fall ist die Collection wieder leer. Alle Änderungen, die Sie hier vornehmen, sind nur in Ihrer Session wirksam.

Nun wollen wir das Formular vervollständigen. Legen Sie in gewohnter Manier einen Link vom Bericht zum Formular an. Verwenden Sie am besten die Spalte SEQ_ID .

Link vom Bericht zum Formular

Abb. 6: Link vom Bericht zum Formular

Passend dazu benötigen Sie folgenden PL/SQL-Prozess, welcher den ausgewählten Satz aus der Collection in das Formular überträgt.

begin
  select 
    c001,
    c002,
    c003
  into
    :P1_DATUM,
    :P1_NAME,
    :P1_UMSATZ
  from apex_collections
  where collection_name = 'TEST_COLLECTION' and seq_id = :P1_SEQNR;
exception
  when NO_DATA_FOUND then 
    :P1_DATUM  := null;
    :P1_NAME   := null;
    :P1_UMSATZ := null;
    :P1_SEQNR  := null;
end;

Das Ergebnis sollte in etwa wie in Abbildung 7 aussehen. Sie können nun neue Sätze hinzufügen und bestehende Sätze ändern. Alles geschieht jedoch nur innerhalb der aktuellen Session.

Neue Einträge anlegen und bestehende ändern

Abb. 7: Neue Einträge anlegen und bestehende ändern

Natürlich ist auch das Löschen von Datensätzen aus der Collection möglich; dazu steht die PL/SQL-Prozedur APEX_COLLECTION.DELETE_MEMBER zur Verfügung. APEX_COLLECTION bietet jedoch noch mehr Funktionalität an:

Funktionen und Prozeduren im Paket APEX_COLLECTION

Abb. 8: Funktionen und Prozeduren im Paket APEX_COLLECTION

Übernahme der Collection in eine Tabelle

Zum Abschluß kommt es darauf an, die Inhalte der Collection in eine "richtige" Datenbanktabelle zu übernehmen. Dies ist beispielsweise der Fall, wenn der Kunde in einem Webshop den Einkaufsvorgang abschließt. Erstellen Sie dazu eine neue Schaltfläche Abschließen und einen dazu passenden PL/SQL-Prozeß. Als PL/SQL-Code wird folgendes hinterlegt:

begin
  insert into umsatz_tab (
    select 
      seq_umsatz_tab.nextval,
      to_date(c001, 'DD.MM.YYYY'),
      c002,
      to_number(c003)
    from apex_collections
    where collection_name = 'TEST_COLLECTION');
end;

Wie Sie an diesem Code erkennen können, werden die Inhalte der Collection einfach an die bestehende Tabelle angehängt. Wenn bestehende Sätze überschrieben werden sollen, bietet sich das SQL MERGE-Kommando an. Im folgenden Beispiel werden die Inhalte der Collection in die Tabelle UMSATZ_TAB "gemischt": Bestehende Dätze werden dabei anhand des Namens und des Datums erkannt.

begin
  merge into umsatz_tab d 
  using (
    select 
      to_date(c001, 'DD.MM.YYYY') datum,
      c002                        name,
      to_number(c003)             umsatz
    from apex_collections
    where collection_name = 'TEST_COLLECTION') s
  on (s.name = d.name and s.datum = d.datum)
  when matched then update set
    d.umsatz = s.umsatz
  when not matched then insert 
    (name, datum, umsatz)
  values (s.name, s.datum, s.umsatz);
end;

Erst nach Ausführung dieses Prozesses werden die Inhalte über die Tabelle UMSATZ_TAB für andere Sessions sichtbar. Mit APEX_COLLECTION.TRUNCATE_COLLECTION kann die Collection dann geleert werden.

Weitere Informationen zu Application Express Collections finden Sie in der Online-Hilfe unter Advanced Programming Techniques - Using Collections. Außerdem können Sie eine Beispielanwendung, welche den Umgang mit Collections demonstriert, in Ihren Workspace installieren. Navigieren Sie zum Application Builder, klicken Sie dort auf die Schaltfläche Erstellen und wählen Sie dann Demo-Anwendung aus. Im darauf folgenden Dialog selektieren Sie die Anwendung Collection Showcase.

Zurück zur Community-Seite