Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Transaktionen mit SQLJ

Dieses Thema im Forum "PostgreSQL" wurde erstellt von ClaudeGable, 6 Januar 2020.

  1. ClaudeGable

    ClaudeGable Neuer Benutzer

    Hallo,

    ich habe bisher folgendes Datenbankschema mit dem zugehörigen Tabellen definiert:

    CREATE SCHEMA BamMolk;

    CREATE TABLE “BamMolk”.Lieferant(
    LiefNr INTEGER PRIMARY KEY IS NOT NULL,
    Name VARCHAR (50)
    );

    CREATE TABLE “BamMolk”.Artikel(
    ArtNr INTEGER PRIMARY KEY IS NOT NULL,
    Bezeich VARCHAR (50)
    );

    CREATE TABLE “BamMolk”.Lager(
    LagNr PRIMARY KEY IS NOT NULL,
    Lagerort VARCHAR (50)
    );

    CREATE TABLE “BamMolk”.ArtLiefLag(
    LiefNr INTEGER IS NOT NULL,
    ArtNr INTEGER IS NOT NULL,
    LagNr INTEGER IS NOT NULL,
    PRIMARY KEY (LiefNr, ArtNr, LagNr),
    FOREIGN KEY (LiefNr) REFERENCES Lieferant (LiefNr) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (ArtNr) REFERENCES Artikel (ArtNr) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (LagNr) REFERENCES Lager (LagNr) ON DELETE CASCADE ON UPDATE CASCADE,
    ); ​

    Nun meine erste Frage: Ist dies (syntaktisch) korrekt?

    Meine zweite Frage: Für den nächsten Teil der Aufgabe sollen 4 Transaktionen spezifiziert werden - unter der Annahme, dass SQLJ zur Verfügung steht, also IF/ELSE-Anweisungen genutzt werden können.

    Die Transaktionen lauten folgendermaßen:

    1. Es soll ein neuer Artikel Frankenkäse in das Sortiment aufgenommen werden, der von einem in der Datenbank gespeicherten Lieferanten Huberhof stammt und am bereits vorhandenen Lager Bamberg-Hafen geführt wird.
    2. Es soll ein neuer Artikel Der herzhafte Jura in das Sortiment aufgenommen werden, der von einem bislang nicht in der Datenbank gespeicherten Lieferanten Molkerei Rennsteig stammt und am neuen Lager Bamberg-Süd geführt wird.
    3. Für den Frankenkäse soll der Lieferant Huberhof gegen den bereits bekannten Lieferanten Molkereigenossenschaft AG getauscht werden.
    4. Die Datenbank soll bereinigt werden. Dazu sollen alle Lieferanten gelöscht werden, die derzeit in keiner Lieferbeziehung stehen.
    Da ich in Java nicht so bewandert bin, stehe ich nun erst mal auf dem Schlauch und hoffe, dass mir hier im Forum auf die Sprünge geholfen werden kann.

    Danke und viele Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru

    1. das IS ist falsch
    2. was ist SQLJ?

    Was Transaktionen betrifft: BEGIN und COMMIT/ROLLBACK sind Deine Freunde.
     
  3. ClaudeGable

    ClaudeGable Neuer Benutzer

    SQLJ bedeuetet, dass SQL in eine Programmiersprache eingebettet ist - in diesem Fall Java.

    D. h. ich bräuchte zur Spezifikation dieser Transaktionen kein Java - es ginge auch ausschließlich mit SQL?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja.

    • für solche PK's eignent sich (BIG) SERIAL's ganz gut
    • " und gRoSs/kLeInScHrEiBuNg ist ätzend
    • bei Verwendung von (BIG)SERIAL für die PK's könnte man die ganzen Aktionen wie 2. in einem einzelnen SELECT gemacht werden - das ist damm immer in EINER Transaktion. (WITH, writeable Common Table Expressions)
     
  5. castorp

    castorp Datenbank-Guru

    Ich dachte SQLJ wäre seit sehr langer Zeit tot.
    Du meinst nicht zufällig "normales" Java das via JDBC mit der Datenbank redet?
     
  6. ClaudeGable

    ClaudeGable Neuer Benutzer

    Ne, es geht laut Aufgabenstellung wirklich um SQLJ. Aber egal...ich will das erstmal nur mit SQL umsetzen.

    Ich habe die Tipps von akretschmer umgesetzt (SERIAL etc.)
    Habe mir nun für die 1. Transaktion folgende Ausdrücke gebaut. Allerdings weiß ich nicht wie ich nun COMMIT etc. anwenden. Könnt ihr mir da helfen?

    INSERT INTO BamMolk.lieferant (name)
    VALUES ('Huberhof');
    INSERT INTO BamMolk.lager (lagerort)
    VALUES ('Bamberg-Hafen');
    INSERT INTO BamMolk.artikel (bezeich)
    VALUES ('Frankenkäse');
    INSERT INTO BamMolk.artlieflag (artnr)
    SELECT artnr FROM BamMolk.artikel
    WHERE bezeich = 'Frankenkäse';
    INSERT INTO BamMolk.artlieflag (liefnr)
    SELECT artnr FROM BamMolk.lieferant
    WHERE bezeich = 'Huberhof';
    INSERT INTO BamMolk.artlieflag (lagnr)
    SELECT lagnr FROM BamMolk.lager
    WHERE lagerort = 'Bamberg-Hafen';​
     
  7. akretschmer

    akretschmer Datenbank-Guru

    solange Du nicht via BEGIN; eine TX startest, erfolgt jedes Statement in einer eigenen TX. Wenn Du mit BEGIN; eine TX startest, dann entweder mit COMMIT; bestätigen oder mit ROLLBACK; zurückrollen. Dies bezieht sich dann auf alles seit dem BEGIN; Beendet sich der Client, ist das impliziet ein ROLLBACK.

    Grüße aus München.
     
Die Seite wird geladen...
Ähnliche Themen - Transaktionen SQLJ
  1. jmar83
    Antworten:
    0
    Aufrufe:
    1.867
  2. evgenij1
    Antworten:
    1
    Aufrufe:
    1.985

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden