Reports in APEX anhand einer Collection erstellen

04.
Februar
2007
Veröffentlicht von: Hildegard Asenbauer

Reports in Application Express basieren in der Regel auf einem Select-Befehl. Gelegentlich kommt es aber vor, dass man die Werte in Form eines Arrays vorliegen hat und diese als Report anzeigen will. Was tun?

Reports in Application Express basieren in der Regel auf einem Select-Befehl. Gelegentlich kommt es aber vor, dass man die Werte in Form eines Arrays vorliegen hat und diese als Report anzeigen will. Was tun?

Der einfachste Weg ist, dass eine Funktion die Collection als Rückgabewert zurückgibt. In diesem Fall kann die Funktion direkt im Select-Befehl aufgerufen werden.  Das folgende Beispiel demonstriert die Vorgehensweise anhand einer Collection eines Objekttyps:

 

Beispiel:

In der Datenbank werden Typen und Funktion erstellt:

CREATE TYPE t AS OBJECT(f1 NUMBER, f2 DATE, f3 VARCHAR2(100));
/

CREATE TYPE t_coll AS TABLE OF t;
/

CREATE OR REPLACE FUNCTION f_object(nr IN NUMBER)
RETURN t_coll
AS
   v_coll t_coll := t_coll();
   v_obj t;
BEGIN
   FOR i IN 1..nr LOOP
      v_obj := t(i, SYSDATE, 'nummer '||i);
      v_coll.EXTEND;
      v_coll(i) := v_obj;
   END LOOP;
   RETURN v_coll;
END;
/

In APEX wird als SQL-Query des Reports hinterlegt, optional noch mit entsprechendem Suchfeld:

SELECT * FROM TABLE(f_object(100)) t
--WHERE t.f3 LIKE '%'||:P1_SEARCH||'%'

Alternativ dazu kann mit der HTMLDB_COLLECTIONS-API gearbeitet werden. In einem geeigneten Prozess (z.B. beim Laden der Seite) wird die Collection befüllt, auf die dann im Report zugegriffen wird. Im folgenden Beispiel wird der Einfachheit halber von der gleichen Funktion wie im obigen Beispiel ausgegengen; gezeigt ist nur der APEX-Code:

 

Beispiel:

Befüllen der Collection:

DECLARE
   v_coll t_coll := t_coll();
   obj t;
BEGIN
   v_coll := f_object(100);
   HTMLDB_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION
            ('MEINE_OBJEKTE');
   FOR i IN 1..v_coll.COUNT LOOP
      obj := v_coll(i);
      HTMLDB_COLLECTION.ADD_MEMBER
         ('MEINE_OBJEKTE',
         obj.f1,
         obj.f2,
         obj.f3);
   END LOOP;
END;

Query des Reports:

SELECT c001, c002, c003
FROM HTMLDB_COLLECTIONS
WHERE collection_name = 'MEINE_OBJEKTE'

Hinweis: Ab Version 3.0 kann auch das Package APEX_COLLECTION anstelle von HTMLDB_COLLECTION verwendet werden.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.