Wer schon einmal versucht hat, ein vernünftiges Pull-Request-Review auf einer Oracle-APEX-Anwendung durchzuführen, kennt den Witz. Das exportierte Install-Skript ist technisch Text, aber von einer Art, die Git aufschreien lässt und Reviewer leise zustimmen, ohne zu lesen. APEX 26.1 führt APEXlang ein, und zum ersten Mal kommt die APEX-Versionskontrolle ohne Entschuldigung aus.
Was APEXlang wirklich ist
APEXlang ist eine deklarative, menschenlesbare Spezifikationssprache für Oracle-APEX-Anwendungen. Eine APEX-Anwendung wird als Paket strukturierter .apx-Textdateien dargestellt — eine pro logischem Artefakt (Seite, Region, Item, Process, Computation, LoV, Shared Component und so weiter). Die Dateien sind so entworfen, dass sie:
- Lesbar für Menschen sind, ohne Werkzeuge.
- Versionierbar mit normalen Git-Workflows sind.
- Validierbar per SQLcl vor dem Import sind.
- KI-tauglich als Input für Generierung und Review sind.
- Nativ unterstützt in Oracle SQL Developer für VS Code und im neuen APEXlang-View des Page Designers sind.
Die entscheidende Verschiebung: APEXlang ist die Spezifikation, nicht der Export. Sie können APEX-Änderungen in .apx-Form schreiben und reviewen und sie dann in den Workspace importieren; die Metadaten in der Datenbank bleiben zur Laufzeit die Quelle der Wahrheit, aber der Quellcode in Git ist nun die Quelle der Wahrheit für Change Management.
Warum das mehr bedeutet, als es klingt
In den meisten Stacks ist Versionskontrolle unsichtbare Infrastruktur. Bei APEX war sie eine strukturelle Reibungsstelle. Drei Dinge haben APEX-Teams in DACH jahrelang behindert:
- Keine echten Diffs. SQL-Install-Skripte erzeugen IDs, Zeitstempel und schwer lesbares XML neu. Diffs waren immer verrauscht.
- Keine echten Reviews. Ohne diffbaren Text degenerierten Code Reviews zu "wir vertrauen dem Entwickler".
- Kein echtes CI/CD. Ohne diffbaren, validierbaren Text waren automatische Qualitätsschranken unmöglich.
All das ist nun gelöst.
Wie sich eine Änderung durch Git bewegt
Hilfreiches mentales Modell: APEXlang führt eine saubere Zwischenschicht zwischen Entwicklerumgebung und Workspace-Metadaten ein. Grob:
- Entwickler ändert im App Builder, in VS Code oder direkt in
.apx-Dateien. - Änderungen werden als APEXlang in den Working Copy exportiert.
- Entwickler committet auf einen Feature-Branch, pusht, öffnet einen Pull Request.
- Reviewer sehen strukturierte, semantische Diffs — Seite A hat ein Item bekommen, Region B hat ihren Source-Query geändert, LoV C hat zwei statische Einträge dazubekommen.
- CI führt SQLcl-Validierung auf dem Branch aus und meldet Fehler zurück an den PR.
- Beim Merge importiert ein Deployment-Job das APEXlang nach Test und befördert nach Prod.
Keiner dieser Schritte ist neu für Software Engineering. Neu ist, dass alle realistisch für APEX sind — ohne hauseigenes Custom-Framework.
Static IDs: die kleine Änderung mit großer Wirkung
Historisch wurden APEX-Komponenten über interne numerische IDs referenziert, die sich bei jedem Export verschoben. Das machte Diffs praktisch nutzlos: ein Rename, und das halbe File schreibt sich neu.
APEXlang stützt sich auf Static IDs: stabile, vom Entwickler kontrollierte Identifikatoren, die Umbenennungen und Verschiebungen überleben. Das Ergebnis ist die unspektakuläre, aber riesige Verbesserung, dass eine Ein-Zeilen-Änderung im App Builder eine Ein-Zeilen-Änderung in der .apx-Datei erzeugt. Reviewer können endlich glauben, was sie lesen.
Wie der Workflow in der Praxis aussieht
Pragmatische Einführungsreihenfolge für ein Team mit, sagen wir, zwölf APEX-Anwendungen:
- Wählen Sie eine mittelkomplexe Anwendung. Nicht die einfachste, nicht die kritischste. Genug Fläche zum Lernen.
- Exportieren Sie sie einmal nach APEXlang. Committen Sie das Ergebnis in ein frisches Repository als Baseline.
- Führen Sie Static IDs ein. Gehen Sie die Anwendung durch und vergeben Sie sinnvolle Static IDs für Seiten, Regionen und Items. Das ist die einmalige Steuer für saubere Diffs.
- Richten Sie SQLcl-Validierung in CI ein. Jeder moderne CI-Runner funktioniert — wichtig ist, dass Branches nicht mergen können, wenn APEXlang fehlschlägt.
- Schreiben Sie ein Deployment-Skript. Einfach anfangen: Import nach Test beim Merge auf
main, manuelle Freigabe nach Prod. - Rollen Sie das Muster auf die nächsten zwei Anwendungen aus. Widerstehen Sie der Versuchung, alle zwölf gleichzeitig zu migrieren.
Die Teams, die am meisten aus APEXlang ziehen, behandeln die erste Anwendung als Lernprojekt und die nächsten drei als Rollout. Wer alles in einem Quartal migrieren will, verliert meist den Faden.
Was APEXlang nicht löst
Zwei ehrliche Einschränkungen. Erstens deckt APEXlang Anwendungsmetadaten ab; es versioniert Ihre Datenbankobjekte nicht. Sie brauchen weiterhin eine separate Schema-Change-Strategie (Liquibase, Flyway, SQLcl Projects oder Ihren eigenen Hausstil). Zweitens ist APEXlang noch jung — Tooling und Konventionen entwickeln sich. Rechnen Sie damit, Ihre Konventionen nach sechs Monaten zu überarbeiten.
Der längere Blick
APEXlang ist die Art Änderung, die eine Plattform erwachsen werden lässt. Ohne sie wären APEX-Teams immer leicht außerhalb der Engineering-Konversation geblieben — andere Review-Tools, andere Deployment-Skripte, anderes Vokabular. Mit ihr sieht ein APEX-Pull-Request aus und verhält sich wie jeder andere Pull Request in der Organisation.
Das ist die Voraussetzung für alles andere, was 26.1 ermöglicht: KI-gestützte Generierung, die reviewbar ist, Audit Trails, die ein externer Auditor wirklich nachverfolgen kann, und ein Workflow, bei dem Ihre Senior Engineers nicht mehr die Augen verdrehen. Die Headliner bekommen die Presse; APEXlang ist das, was sie tragfähig macht.
