Automatisierter Export und Import von APEX-Anwendungen per Kommandozeile
Erscheinungsmonat |
APEX-Version |
Datenbankversion |
Juli 2011 |
ab 2.2 |
ab 9.2 |
Wenn APEX-Installationen im Rechenzentrum betrieben werden, entsteht immer häufiger die
Notwendigkeit, Anwendungsexporte nicht mehr über die APEX-Oberfläche, sondern skriptgesteuert
durchzuführen. Ein Grund dafür kann bspw. sein, dass das die APEX-Entwicklungsumgebung auf
dem Produktivsystem entfernt wurde (Runtime-Only-Install). Neue
Anwendungen müssen also auf einem anderen Wege installiert werden. Auch kann es interessant sein,
die Anwendungen des Entwicklungssystems (bspw. jeden Abend) automatisiert zu exportieren und (zum Beispiel)
in das Versionskontrollsystem einzustellen.
Es ist nicht jedem bekannt, aber APEX bringt die nötigen Werkzeuge bereits mit. Wenn Sie
APEX heruntergeladen und das ZIP-Archiv ausgepackt haben, befinden sich die Exportwerkzeuge
im Verzeichnis utilities und dort unter oracle und apex. Allerdings liegen die Werkzeuge nur als reine Java-Klassendateien (.class) vor.
Damit sie nutzbar werden, sind noch ein paar Vorbereitungen nötig.
Unterverzeichnis "utilities"
Vorbereitungen
Um die Werkzeug benutzen zu können, erzeugen Sie sich am besten zunächst
ein Unix-Skript bzw. eine Windows-Batch-Datei.
Passen Sie jedoch bei den folgenden Skripten die
Umgebungsvariablen ORACLE_HOME und
APEX_HOME an Ihre Umgebung an.
Die Werkzeuge sind in Java geschrieben - benötigen also eine Java-Umgebung, um laufen zu können. In diesem
Beispiel nehmen wir die Java-Umgebung, die mit der Oracle-Datenbank mitinstalliert wird ($ORACLE_HOME/jdk). Wenn
Sie OracleXE verwenden, müssen Sie eine andere schon vorhandene Java-Umgebung nehmen bzw. eine neue herunterladen und installieren. Ebenso dürfte die in den Skripten referenzierte Datei $ORACLE_HOME/oui/jlib/classes12.jar in OracleXE nicht vorhanden sein. Laden Sie sie dann einfach aus dem OTN herunter und passen Sie die Skripte entsprechend an.
Auf Windows-Systemen sieht das Skript wie folgt aus:
Informationen über den Aufruf erhält man, wenn man das Skript ohne Parameter aufruft.
Richten Sie anschließend das Splitter-Werkzeug ein. Damit können Sie die APEX-Exportdatei in
ihre Bestandteile zerlegen. Legen Sie die Skripte wie vorhin an, verwenden Sie in der letzten
Zeile nur anstelle der Klasse APEXExport die Klasse APEXExportSplitter.
Auf Windows-Systemen sieht das Skript wie folgt aus:
Exportieren per Kommandozeile
Wenn Sie die Skripte bzw. Batchdateien fertig haben, kann es losgehen. Das folgende Beispiel
exportiert eine Anwendung (in diesem Beispiel wurde das oben beschriebene Unix-Skript
export-skript.sh genannt).
Die Skriptausgabe ist recht unspektakulär, aber im Betriebssystemverzeichnis befindet sich
nun die Datei f100.sql, genauso, als ob Sie den Export
über die APEX-Oberfläche gemacht hätten.
Wenn es nun daran geht, die Datei in ein Versionskontrollsystem einzustellen, kann es interessant
sein, die Datei in ihre Komponenten aufzusplitten. Gegebenenfalls möchte man ja nur eine einzelne
Seite auf dem Produktivsystem neu einspielen. Dazu dient der APEXExportSplitter.
Und der funktioniert wie
folgt.
Auch hier ist die Ausgabe eher unspektakulär - aber im Hintergrund ist einiges entstanden ...
Abbildung 2: Die APEX Exportdatei wurde in die einzelnen Komponenten aufgespalten
Der Splitter kann übrigens auch mit Exportdateien arbeiten, die aus der Oberfläche heraus
exportiert wurden. Jede einzelne der Komponenten kann auch einzeln wieder importiert werden.
Wenn Sie den Splitter mit der Option -update aufrufen, vergleicht
das Werkzeug die Dateien
anhand einer Checksumme und generiert ein Update-Skript, welches nur die veränderten
Anwendungsteile neu einspielt. Diese Optionen sind sehr hilfreich, wenn die Komponenten in
ein Versionskontrollsystem eingecheckt werden.
Importieren der Dateien - von der Kommandozeile
Wenn Sie sich eine Exportdatei
genauer ansehen, dann stellen Sie fest, dass es im Grunde genommen ein SQL-Skript ist - und
SQL-Skripte können mit SQL*Plus eingespielt werden. Und genau das ist schon seit
dem ersten Release von Application Express möglich - Kommandozeilen-Imports waren prinzipiell
also schon immer möglich. Man muss jedoch etwas tun, wenn eine
Exportdatei in ein anderes Workspace eingespielt werden soll oder wenn die Applikations-ID auf
dem Zielsystem eine andere sein soll (weil die Original-ID vielleicht schon belegt ist). Beginnen
wir mit dem Import in einen anderen Workspace. Zunächst loggen Sie sich mit SQL*Plus ins Datenbankschema,
welches dem Ziel-Workspace zugeordnet ist, ein ...
Danach starten Sie das Skript ...
Sie werden recht schnell feststellen, dass der Import so nicht funktioniert. Die in der Exportdatei
hinterlegte Workspace-ID ist eine andere als die des Workspace, in den Sie importieren möchten. Während
die APEX-Entwicklungsumgebung damit problemlos umgehen kann, müssen Sie beim Kommandozeilenimport
selbst aktiv werden. Und die erste Aktion ist, die Workspace-ID festzustellen - das machen Sie ebenfalls
in SQL*Plus.
Vor APEX 4.0 hätte man nun die Exportdatei "hacken" müssen - zum Glück ist das nicht mehr
nötig. APEX 4.0 führt das PL/SQL Paket APEX_APPLICATION_INSTALL ein, welches aber nur
mit Dateien funktioniert, die mit APEX 4.0 exportiert wurden. Im folgenden stellen wir
mit APEX_APPLICATION_INSTALL die richtige Workspace-ID ein und stellen darüber hinaus
die neue Application-ID auf 999999 ein.
Danach starten Sie nochmal das Skript f100.sql. Insbesondere wenn Sie auf der gleichen
Datenbank importieren, aus der heraus auch exportiert wurde, werden Sie dann aber
wahrscheinlich den folgenden Fehler sehen ...
Der Grund hierfür sind die generierten Primärschlüssel für die einzelnen Komponenten;
APEX versucht hier, eine ID wiederzuverwenden, was natürlich nicht geht - jede ID darf
nur einmal vorhanden sein. Aber auch hierfür bietet APEX_APPLICATION_INSTALL Abhilfe. Machen
Sie einen zusätzlichen Aufruf von APEX_APPLICATION_INSTALL.SET_OFFSET. Nehmen Sie irgendeine
Zufallszahl als Offset. APEX wird diese beim Erzeugen der Primärschlüssel berücksichtigen und so
eindeutige Werte erzeugen.
Danach läuft das Skript problemlos durch.
Wenn Sie sich in das Workspace einloggen, ist die importiere APEX-Anwendung unter der neuen
ID 999999 vorhanden (Abbildung 3).
Abbildung 3: Die Applikation wurde per Kommandozeile erfolgreich importiert
Einzelne Anwendungskomponenten per Kommandozeile importieren
Als nächstes wird gezeigt, wie Sie eine einzelne Komponente in Ihre Anwendung einspielen können.
Angenommen, Sie haben die Seite 2 versehentlich gelöscht oder Sie möchten aus einem anderen
Grund nur für die Seite 2 auf den Stand der Exportdateien zurückgehen. Im besten Fall liegen
die Exportdateien im Versionskontrollsystem, so dass Sie sich die gewünschte Version einfach
aus diesem herausziehen können. Zum Ausprobieren löschen Sie einfach die Seite 2.
Navigieren Sie dann in das Verzeichnis application, welches das Splitter-Werkzeug angelegt hat.
Starten Sie darin SQL*Plus und setzen Sie wiederum die Umgebung mit APEX_APPLICATION_INSTALL.
Das Skript, welches nur die Seite 2 neu einspielt, befindet sich im Verzeichnis pages unterhalb
von application und trägt den namen page_00002.sql. Warten Sie aber noch mit dem direkten Aufruf,
denn zunächst muss die SQL*Plus-Datenbanksitzung noch für den Import einer APEX-Komponente vorbereitet
werden (beim Import einer Gesamt-Applikation wird dies automatisch gemacht). Rufen Sie zuerst das Skript init.sql und dann set_environment.sql auf - beide liegen direkt
im Verzeichnis application. Achten Sie darauf, dass Sie die gleiche Datenbanksitzung verwenden wie
beim Aufruf von APEX_APPLICATION_INSTALL (SQL*Plus also nicht zwischendurch verlassen).
Und jetzt ist es soweit. Stellen Sie nur die Seite 2 wieder her.
Und das war es auch schon - die Seite 2 ist wieder da. Genauso können Sie auch die
anderen Komponenten einzeln wieder einspielen. Man sieht sehr schön, dass Ihnen mit diesen
beiden unscheinbaren Java-Klassendateien zwei sehr mächtige Werkzeuge an die Hand gegeben werden. Nimmt
man SQL*Plus als Importwerkzeug dazu, lassen sich mit APEX genauso mächtige Deployment-Prozesse
aufsetzen, wie man es von anderen Entwicklungsumgebungen her kennt.
Zurück zur Community-Seite
|