# Problem mit Insert in zwei Tabellen



## werdas34 (23. Nov 2018)

Hallo,
ich soll eine Methode schreiben, die Werte in zwei Tabellen schreibt.
Die Querys wurden mit der Datenbank in Postgres getestet und liefern, das gewünschte Ergebnis.
Jedoch wenn ich es über mein Programm laufen lasse, dann werden nur die Werte in die erste Tabelle richtig eingefügt, in der zweiten passiert garnichts. Es wird weder eine Exception geworfen noch tritt ein anderer Fehler auf. 


```
public void bestellen() throws Exception {
        Scanner read = new Scanner(System.in);

        System.out.print("Kundenname:");
        String kunde = read.nextLine();
        System.out.print("Warenname:");
        String ware = read.nextLine();
        System.out.print("Anzahl der bestellten Ware:");
        int anzahl = read.nextInt();

        try {
            Statement stmt = con.createStatement();

            String query1 = " insert into bestellung(bestid, datum, status, kundid) "
                    + " select nextval('bestellid'), CURRENT_DATE, 0, kundeid from kunde " + " where kname = '" + kunde
                    + "' ;" + " insert into enthaelt(bestid, anzahl, warenid) " + " select currval('bestellid'), "
                    + anzahl + ", warenid from ware " + " where bezeichnung = ' " + ware + "' ";
            stmt.executeUpdate(query1);

        } catch (SQLException e) {
            System.out.println("SQLException:");
            while (e != null) {
                System.out.println("SQLState:" + e.getSQLState());
                System.out.println("Message:" + e.getMessage());
                System.out.println("ErrorCode:" + e.getErrorCode());
                e = e.getNextException();
            }
        }
    }
```

Das was ich als problematisch ansehe ist, das wenn ich dies in Postgres teste, ich beide insert gleichzeitig einfügen muss, denn sonst wird der Wert für currval('bestellid') im zweiten insert nicht gefunden. (currval('bestellid') bezieht sich auf nextval('bestellid') vom ersten insert)

Ich habe nuun schon bisschen rumprobiert, wie ich es schaffe beide inserts gleichzeitig einzufügen. Jedoch nicht wirklich was brauchbares hinbekommen.

Habt ihr Lösungsvorschläge?

Danke.
mfg werdas34


----------



## mihe7 (23. Nov 2018)

Du musst die beiden INSERTs trennen. Das sollte auch kein Problem darstellen, da lt. PostgreSQL-Doku nextval() nur innerhalb der gleichen Session aufgerufen worden sein muss.

Abgesehen davon: verwende PreparedStatement und try-with-resources.


----------



## werdas34 (23. Nov 2018)

mihe7 hat gesagt.:


> Du musst die beiden INSERTs trennen.


Meinst du so ?

```
String query1 = " insert into bestellung(bestid, datum, status, kundid) "
                    + " select nextval('bestellid'), CURRENT_DATE, 0, kundeid from kunde " + " where kname = '" + kunde
                    + "' ";
            String query2 =  " insert into enthaelt(bestid, anzahl, warenid) " + " select currval('bestellid'), "
                    + anzahl + ", warenid from ware " + " where bezeichnung = ' " + ware + "' ";
            stmt.executeUpdate(query1);
            stmt.executeUpdate(query2);
```
Funktioniert nämlich auch nicht. Hatte ich am Anfang.



mihe7 hat gesagt.:


> Abgesehen davon: verwende PreparedStatement und try-with-resources.


Es ist eine Aufgabe in der heißt es man soll ein einfaches Statement nutzen. Das PreparedStatement kam dann bei einer anderen Aufgabe dran.


----------



## mihe7 (23. Nov 2018)

werdas34 hat gesagt.:


> Meinst du so ?


Ja.


werdas34 hat gesagt.:


> Funktioniert nämlich auch nicht.


Welche Exception fliegt?


----------



## werdas34 (23. Nov 2018)

mihe7 hat gesagt.:


> Ja.
> 
> Welche Exception fliegt?


Gar keine..


----------



## mihe7 (23. Nov 2018)

Und wo liegt dann das Problem?


----------



## werdas34 (23. Nov 2018)

Die zweite Tabelle(enthaelt) hat keine Einträge. Die erste (Bestellung) dagegen schon.
Und keine Exception in Java und sonst auch nichts.


----------



## mihe7 (23. Nov 2018)

Liegt es evtl. an dem Leerzeichen vor den doppelten Anführungszeichen? `where bezeichnung = ' "`


----------



## werdas34 (23. Nov 2018)

Jap. Ich habe ja selber geschaut, ob ich ein Leerzeichen oder ähnliches falsch platziert habe, aber mir ist nichts aufgefallen.

Jedoch danke dir.


----------

