Daten- und Regelkern · Prio 10 · Version 4

Oracle Datenbank / Stored Procedures

Tabellen, Views, Packages, Trigger, Stored Procedures und Reporting-Abfragen als versteckte Fachlogik.

← Startseite
Kurzverständnis und Systemgrenze

Viele Legacy-Systeme enthalten einen grossen Teil ihrer Fachlogik in Stored Procedures, Packages, Triggern, Views und Datenkorrekturskripten. Das ist nicht automatisch schlecht: Datenbanklogik kann sehr stabil, performant und transaktional konsistent sein.

Problematisch wird es, wenn Anwendungscode und Datenbanklogik denselben fachlichen Zustand aus unterschiedlichen Perspektiven veraendern. Dann entstehen schwer testbare Seiteneffekte: Trigger setzen Status, Packages korrigieren Beträge, Views verstecken Filterregeln.

Modernisierung beginnt mit Dateninventar und Regelkatalog. Danach kann man entscheiden, welche Regeln in der Datenbank bleiben, welche in Services wandern und wo ein Parallelbetrieb mit Vergleichsabfragen notwendig ist.

Daten- und Verantwortungsgrenze: Die Datenbank ist oft mehr als Persistenz. Sie besitzt Datenmodell, Constraints, fachliche Regeln, Korrekturmechanismen, Performance-Wissen und historische Semantik. Eine Migration ohne Datenverstehen ist riskanter als eine reine Code-Migration.
Fachliche und technische Darstellung
Fachliche Sicht Oracle Datenbank / Stored Procedures
Fachliche Sicht: Prozess, Verantwortung, Nachweis.
Technische Sicht Oracle Datenbank / Stored Procedures
Technische Sicht: Komponenten, Protokolle, Betriebsbezug.
Wichtige Begriffe und Artefakte

Stored Procedure

Prozedurale Logik in der Datenbank, oft fuer Validierung, Berechnung oder Massenverarbeitung.

Trigger

Automatisch ausgeloeste Logik bei Insert, Update oder Delete.

Materialized View

Vorberechnete Sicht fuer Reporting oder Performance.

Data Lineage

Nachvollziehbarkeit, wo Daten entstehen, transformiert und konsumiert werden.

Typischer Ablauf Schritt für Schritt
  1. Anwendung ruft Procedure oder schreibt Tabelle.
  2. Constraints und Trigger validieren oder veraendern Daten.
  3. Package fuehrt Berechnung, Statuswechsel oder Buchungslogik aus.
  4. Views und Materialized Views stellen Daten fuer Reporting bereit.
  5. ETL oder Batch liest Daten fuer DWH, Archiv oder Partnerausleitung.
Ausführliche Praxisbeispiele mit Code und Konfiguration

Die Beispiele sind bewusst nicht minimalistisch. Sie zeigen typische Artefakte, die man in echten Legacy-Analysen findet: Schnittstellenverträge, Containerkonfiguration, SQL/PL-SQL, Jobdefinitionen, Queue-Regeln oder Adaptercode.

PL/SQL Package fuer Rechnungsfreigabe
CREATE OR REPLACE PACKAGE billing_rules AS
  PROCEDURE approve_invoice(p_invoice_id IN NUMBER, p_user IN VARCHAR2);
  FUNCTION calculate_tax(p_net_amount IN NUMBER, p_country IN VARCHAR2) RETURN NUMBER;
END billing_rules;
/
CREATE OR REPLACE PACKAGE BODY billing_rules AS
  PROCEDURE approve_invoice(p_invoice_id IN NUMBER, p_user IN VARCHAR2) IS
    v_status VARCHAR2(20);
  BEGIN
    SELECT status INTO v_status FROM invoice WHERE id = p_invoice_id FOR UPDATE;
    IF v_status <> 'READY' THEN
      RAISE_APPLICATION_ERROR(-20010, 'Invoice is not ready for approval');
    END IF;
    UPDATE invoice SET status = 'APPROVED', approved_by = p_user, approved_at = SYSTIMESTAMP
    WHERE id = p_invoice_id;
  END;
  FUNCTION calculate_tax(p_net_amount IN NUMBER, p_country IN VARCHAR2) RETURN NUMBER IS
  BEGIN
    RETURN CASE WHEN p_country = 'AT' THEN p_net_amount * 0.20 ELSE p_net_amount * 0.19 END;
  END;
END billing_rules;
Trigger als versteckte Statushistorie
CREATE OR REPLACE TRIGGER trg_invoice_status_hist
AFTER UPDATE OF status ON invoice
FOR EACH ROW
BEGIN
  INSERT INTO invoice_status_history(invoice_id, old_status, new_status, changed_at)
  VALUES (:OLD.id, :OLD.status, :NEW.status, SYSTIMESTAMP);
END;
Repository kapselt Procedure-Aufruf
public class InvoiceApprovalRepository {
    private final DataSource dataSource;

    public void approve(long invoiceId, String user) throws SQLException {
        try (Connection con = dataSource.getConnection();
             CallableStatement st = con.prepareCall("{call billing_rules.approve_invoice(?, ?)}")) {
            st.setLong(1, invoiceId);
            st.setString(2, user);
            st.execute();
        }
    }
}
Risiken, Fehlerbilder und Diagnose
AspektBeschreibung
Fachliches RisikoUnklare Verantwortung fuer Kundenbestand fuehrt zu widerspruechlichen Entscheidungen zwischen Alt- und Neusystem.
Technisches RisikoOracle und angrenzende Komponenten werden isoliert betrachtet; Laufzeitkopplung bleibt verborgen.
BetriebsrisikoFehlerkanal, Monitoring, Restart oder manuelle Klaerung sind nicht ausreichend dokumentiert.
MigrationsrisikoNeue Architektur uebernimmt Daten oder Schnittstellen, ohne fachliche Invarianten und historische Sonderfaelle abzusichern.
Typische Fallen:
  • Trigger veraendern Daten unbemerkt und Tests pruefen nur Anwendungscode.
  • Stored Procedures enthalten fachliche Regeln ohne Versionskontrolle.
  • Neue Services greifen direkt auf Tabellen zu und umgehen bestehende Invarianten.
  • Performance-Tuning wird bei Migration ignoriert: Indizes, Statistiken, Partitionen und Locks.
Modernisierungspfad und geeignete Entwurfsmuster
PatternEinsatz in diesem System
Strangler Fig PatternNeue Funktionalitaet vor das Altsystem setzen und Altanteile schrittweise herausloesen.
Anti-Corruption LayerAltbegriffe, technische Codes und Datenformate vom neuen Domänenmodell trennen.
FacadeKomplexe Legacy-Operationen hinter klaren fachlichen Use-Case-Methoden kapseln.
AdapterProtokolle und Formate wie SOAP, MQ, Copybook, SQL oder File in Ports uebersetzen.
Golden Master TestBestehendes Verhalten mit Referenzdaten erfassen und gegen neue Implementierung vergleichen.
Empfohlene Schritte:
  • Inventarisiere Packages, Procedures, Trigger, Views und Tabellenzugriffe.
  • Erstelle Testdaten und Referenzresultate fuer kritische PL/SQL-Regeln.
  • Kapsle Datenzugriff ueber Repository oder Data Access Facade.
  • Plane Datenmigration mit DDL, DML, Validierung, Rueckfall und Parallelvergleich.
Analysefragen für echte Projekte
  • Wer besitzt fachlich die Wahrheit fuer Kundenbestand?
  • Welche technische Komponente ist kritisch: Oracle, PL/SQL, Packages?
  • Welche Daten werden veraendert, gelesen, abgeleitet oder nur transportiert?
  • Welche Fehler sind fachlich erwartbar und welche sind technische Stoerungen?
  • Welche Protokolle, Dateien, Tabellen, Queues oder Reports bilden den offiziellen Vertrag?
  • Wie wird ein Fehler heute erkannt, korrigiert und gegenueber dem Fachbereich nachgewiesen?
  • Welche Teile lassen sich lesend modernisieren und welche sind schreibend hochkritisch?
  • Welche Tests sichern aktuelles Verhalten, bevor Refactoring oder Migration beginnt?
Übung

Suche in einer fiktiven Datenbank alle Trigger und Packages rund um Rechnung. Ordne sie fachlichen Regeln zu. Entscheide pro Regel: bleibt in DB, wird gekapselt, wird getestet oder wandert in Application Service.

⌂ Cockpit