APEX-Export auf Kommandozeile

03.
Mai
2012
Veröffentlicht von: Marco Patzwahl

Haben Sie sich auch schon mal gefragt, wie man seine schönen APEX Applikationen sichert?
Ja natürlich, Sie können das über die grafische Oberflächen machen. Aber zeitgesteuert, nachts um 3.00 Uhr zusammen mit der Datenbank?
Na, dann stellen Sie mal den Wecker... oder verwenden Sie den folgenden Tipp:

Haben Sie sich auch schon mal gefragt, wie man seine schönen APEX Applikationen sichert?

Ja natürlich, Sie können das über die grafische Oberflächen machen. Aber zeitgesteuert, nachts um 3.00 Uhr zusammen mit der Datenbank?
Na, dann stellen Sie mal den Wecker... oder verwenden Sie den folgenden Tipp:

Erst schauen wir mal, welche schönen APEX Applikationen wir haben:

SELECT application_id,application_name
FROM apex_applications;


Als ersten Schritt, können wir eine Applikation über deren Nummer in ein Directory exportieren. APEX liefert schon über eine Routine die komplette App als CLOB zurück. Jetzt musste nur noch ein Package her, welches CLOB´s direkt in das Betriebssystem schreibt. Fündig geworden bin ich im Package DBMS_XSLPROCESSOR.CLOB2FILE.
Das spart einem viele lästige Schritte :-)

Wir verwenden hier das DATA_PUMP_DIR Directory zum Schreiben, weil das meistens schon vorhanden ist. Sie können jedoch auch jedes andere Verzeichnis benutzen.
Vergeben Sie das Schreibrecht am Directory an den Benutzer, der den Export ausführt (dem sollte auch die APEX Applikation gehören).

GRANT WRITE ON DIRECTORY data_pump_dir TO scott;


APEX App exportieren:

BEGIN
DBMS_XSLPROCESSOR.CLOB2FILE (
wwv_flow_utilities.export_application_to_clob(100), 'DATA_PUMP_DIR', 'APEX_100_'||
to_char(sysdate,'DDMMYYYY_HH24MISS')||'.sql');
END;
/


Im zweiten Beispiel werden alle APEX Apps gesichert, die sich in den letzten 24 Stunden geändert haben. Führen Sie den Export z. B. als System durch (NICHT als SYS):

DECLARE
-- In welches Directory sollen die Exports erfolgen?
v_dir VARCHAR2(255):=upper('DATA_PUMP_DIR');
-- Wenn eine Applikation in den letzten 24 Stunden geändert worden ist
-- wird ein neues Backup erzeugt
v_stunden NUMBER:=24;
BEGIN
FOR r IN (select application_id,last_updated_on
          from apex_applications
          WHERE APPLICATION_ID<3000) LOOP
          IF r.last_updated_on>sysdate-(v_stunden/24) THEN
          -- Apex App in Clob wandeln und als Datei in Directory legen
            DBMS_XSLPROCESSOR.CLOB2FILE (
            wwv_flow_utilities.export_application_to_clob(r.application_id), v_dir,
            'APEX_'||r.application_id||'_'||to_char(sysdate,'DDMMYYYY_HH24MISS')||'.sql');
          END IF;
END LOOP;
END;
/


Nun wollen wir Seiten einzeln sichern, aber erst schauen wir mal, wann es Änderungen in den Seiten gab:

select application_id,max(last_updated_on)
          from apex_applications
          WHERE APPLICATION_ID<3000
          group by application_id

REM Nur eine einzelne Seite (App 100, Seite 1) sichern:
REM Nur der Eigentümer der App darf exportieren (auch SYS nicht)

BEGIN
DBMS_XSLPROCESSOR.CLOB2FILE (
wwv_flow_utilities.export_page_to_clob(100,1), 'DATA_PUMP_DIR', 'apex_f100_p1.sql');
END;
/


Nun können wir prüfen, welche Seiten in den letzten 30 Tage geändert wurden:

SELECT application_id,application_name,page_id,page_name,page_title,last_updated_on
FROM apex_application_pages
WHERE last_updated_on>sysdate-30
AND application_id<3000;


Zu guter Letzt ein Beispiel als automatischer Export aller Seiten, die sich in den letzten 30 Tagen geändert haben:

DECLARE
v_dir VARCHAR2(255):=upper('DATA_PUMP_DIR');
BEGIN
FOR r IN (SELECT a.application_id,ap.page_id
            FROM apex_application_pages ap,apex_applications a
            WHERE ap.application_id=a.application_id
            AND ap.last_updated_on>sysdate-30
            AND a.application_id<3000
            AND a.owner=user) LOOP
                DBMS_XSLPROCESSOR.CLOB2FILE (
                cl=>wwv_flow_utilities.export_page_to_clob(
                r.application_id,r.page_id),
                FLOCATION=>v_dir,
                FNAME=>'APEX_'||r.application_id||'_'||r.page_id||'_'||
                to_char(sysdate,'DDMMYYYY_HH24MISS')||'.sql');        
END LOOP;
END;
/

Wenn Sie APEX nicht durch mühsames Probieren selbst erlernen wollen, kommen Sie doch in eine unserer beiden 5 Tages-Schulungen (Opens internal link in current windowGrundlagen / Fortschritt).

APEX

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.