Dienstag, 7. April 2026

Oracle View SQL Auslesen

 Um einen Unique Key (eindeutigen Schlüssel) über zwei Spalten zu erstellen, hast du zwei Möglichkeiten. Er sorgt dafür, dass die Kombination aus beiden Werten in der Tabelle nur ein einziges Mal vorkommen darf.

1. Eine bestehende Tabelle nachträglich anpassen

Das ist der häufigste Fall. Du fügst einen sogenannten UNIQUE CONSTRAINT hinzu:

SQL
ALTER TABLE LXSPROINFO_QA.DEINE_TABELLE 
ADD CONSTRAINT UC_MAPPING_UNIQUE UNIQUE (SPALTE_A, SPALTE_B);
  • Wichtig: Oracle prüft beim Ausführen sofort, ob es bereits Duplikate gibt. Wenn ja, bricht der Befehl mit einer Fehlermeldung ab.

  • Name des Constraints: Ich habe ihn hier UC_MAPPING_UNIQUE genannt. Es ist ratsam, einen sprechenden Namen zu vergeben, damit du bei Fehlermeldungen sofort weißt, welche Regel verletzt wurde.

2. Direkt beim Erstellen der Tabelle (CREATE TABLE)

Falls du die Tabelle gerade erst neu anlegst:

SQL
CREATE TABLE LXSPROINFO_QA.DEINE_TABELLE (
    ID NUMBER PRIMARY KEY,
    SPALTE_A VARCHAR2(50),
    SPALTE_B VARCHAR2(50),
    CONSTRAINT UC_KOMBIDATEN UNIQUE (SPALTE_A, SPALTE_B)
);

Was passiert bei NULL-Werten?

In Oracle gilt eine Besonderheit: Wenn beide Spalten NULL sind, wird der Unique Constraint nicht verletzt (da NULL nicht gleich NULL ist). Wenn du sicherstellen willst, dass die Kombination immer vorhanden sein muss, sollten beide Spalten auch als NOT NULL definiert sein.

Bezug zu deinem OJB-Problem (pkValues=null)

Dieser Punkt ist jetzt extrem wichtig für deinen Fehler:

  1. Zusammengesetzter Primärschlüssel: Wenn diese zwei Felder eigentlich dein Primary Key sind (und keine separate ID-Spalte existiert), musst du sie in OJB als primarykey="true" für beide Felder mappen.

  2. Fehlende Werte: Wenn du diesen Unique Key jetzt erstellst und dein Java-Code (OJB) versucht, einen Datensatz zu speichern, bei dem diese Kombination schon existiert, wird ein SQL-Fehler geworfen.

  3. Mapping-Check: Wenn du in der Datenbank einen Unique Key über zwei Felder hast, OJB aber im repository.xml nur eines davon als Teil des Identifiers kennt, kann OJB das Objekt nicht korrekt "extrahieren" – das führt genau zu der ClassNotPersistenceCapableException.

Tipp für SQuirreL:

Falls du Duplikate in der Tabelle hast, die das Erstellen des Keys verhindern, kannst du sie so finden:

SQL
SELECT SPALTE_A, SPALTE_B, COUNT(*)
FROM LXSPROINFO_QA.DEINE_TABELLE
GROUP BY SPALTE_A, SPALTE_B
HAVING COUNT(*) > 1;

Soll ich dir zeigen, wie du die Duplikate sicher löschst, damit du den Unique Key danach fehlerfrei anlegen kannst?

Keine Kommentare: