DBMS_OUTPUT mit Application Express nutzen

Vielfach wird in bereits vorhandenen PL/SQL-Prozeduren, Funktionen und -Packages DBMS_OUTPUT.PUT_LINE verwendet, um Meldungen auszugeben. In SQL*Plus werden diese angezeigt, wenn man die Bildschirmausgabe vor dem Starten der Prozedur mit set serveroutput on aktiviert.

Doch was ist, wenn man diesen PL/SQL-Code aus einem Application Express-Prozeß heraus aufruft? Schließlich kann man in Application Express kein "set serveroutput on" absetzen - das funktioniert nur in SQL*Plus.. Aber Sie können die Meldungen dennoch in APEX sichtbar machen - hier sehen Sie, wie:

Spielen Sie über den SQL Workshop oder SQL*Plus folgende Prozedur ein; Sie können natürlich auch eine vorhandene nehmen, von der Sie wissen, dass sie DBMS_OUTPUT verwendet.

create or replace procedure mach_etwas is
begin
  for i in 1..10 loop
    dbms_output.put_line('Meldung Nr. '||i);
  end loop;
end;

In SQL*Plus sieht das Ergebnis wie folgt aus:

SQL> set serveroutput on
SQL> exec mach_etwas
Meldung Nr. 1
Meldung Nr. 2
Meldung Nr. 3
Meldung Nr. 4
Meldung Nr. 5
Meldung Nr. 6
Meldung Nr. 7
Meldung Nr. 8
Meldung Nr. 9
Meldung Nr. 10

PL/SQL-Prozedur erfolgreich abgeschlossen.

Nun sei ein Application Express-Prozeß denkbar, der diese Prozedur verwendet; ein onSubmit-Prozeß könnte die Prozedur bei Klick auf die Schaltfläche Ausführen wie folgt nutzen:

begin
  mach_etwas;
end;

Auf diese Art und Weise haben Sie noch keinen Zugang zu den mit DBMS_OUTPUT erzeugten Meldungen. Dazu muss der Prozesscode ein wenig geändert werden. Vorher sollten Sie sich jedoch selbst die Frage beantworten, was Sie mit den Meldungen machen wollen - denkbar ist vieles ...

  • Speichern in einer eigenen Tabelle und Darstellung mit einem Bericht
  • Ausgabe als APEX Debugging-Meldungen mit wwv_flow.debug
  • Speichern in einer APEX Collection (keine persitente Tabelle) und Ausgabe als Bericht

Sollen die Meldungen als APEX Debugging-Meldungen ausgegeben werden (Variante 2), müsste der Prozeß wie folgt aussehen.

declare
  v_zeilen   dbms_output.chararr;
  v_anzahl   integer := 100;
begin
  -- DBMS_OUTPUT aktivieren
  dbms_output.enable;

  -- eigentliche Prozedur ausführen
  mach_etwas;
  
  -- Meldungszeilen aus den Puffern abrufen; es werden max. 100 Zeilen abgerufen (v_anzahl) 
  dbms_output.get_lines(v_zeilen, v_anzahl);

  -- Meldungszeilen mit WWV_FLOW.DEBUG als APEX Debugging-Meldungen ausgeben
  for i in 1..v_anzahl loop
    wwv_flow.debug('<span style="font-size: 20pt; color: red;">DBMS_OUTPUT: '||v_zeilen(i)||'</span>');
  end loop;
end;

Wenn Sie nun in der Developer-Toolbar den Debug-Modus einschalten ...

Debug-Modus einschalten

Abbildung 1: Debug-Modus einschalten

... dann sehen Sie die mit DBMS_OUTPUT erzeugten Meldungen wie folgt.

Im Debug-Modus angezeigte Meldungen

Abbildung 2: Im Debug-Modus angezeigte Meldungen

Man muss die Prozeduren also nicht umschreiben; sie können die Aufrufe von DBMS_OUTPUT auch in APEX nutzen.

Zurück zur Community-Seite