# SQL Abfrage über PreparedStatement mit UPDATE in Verbindung mit EXISTS liefert Fehler



## Walter91 (5. Jun 2015)

Hallo liebe Forumgemeinde,

wie solls anders sein, ich hab ein Problem mit einer Aufgabe aus nem Übungsblatt für Informatik 2.
Es geht darum, dass auf dem Server der Uni eine mySQL Datenbank eingerichtet wurde und diese eine Tabelle
Hund enthält, mit Spalten: ID, name, lebensalter, besitzer
Sie wurde anhand dieser SQL-Abfrage erzeugt:
CREATE TABLE Hund
(
ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
lebensalter SMALLINT UNSIGNED NOT NULL,
besitzer VARCHAR(20),
PRIMARY KEY (ID)
);

Ziel ist es nun ein Java-Programm zu schreiben, welches eine Verbindung  zur Datenbank herstellt und über Kommandozeilenparameter bestimmte  Funktionalitäten bereit stellt. Die Aufgabe, die mir Probleme bereitet  ist folgende:
Mit Kommandozeilenparametern der Form
-modify <id> <attributname> <attributwert>
soll eine beliebige Spalte (mit Ausnahme der ID) der Tabelle Hund modiziert werden
konnen. Vorher muss naturlich sichergestellt werden, dass ein Tupel mit dieser ID auch
existiert. Der Benutzer soll benachrichtigt werden, falls kein Tupel mit dieser ID existiert.

Mir ist klar, dass man mit EXISTS auf Existenz prüfen kann, ich hab das auch umgesetzt, erhalte jedoch folgenden Fehler:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Der Code dazu:

```
package aufgabe26;

import java.sql.*;

public class Aufgabe26 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        if (args.length == 0) {
            System.out.println("Kein Kommandozeilenparameter übergeben!");
            return;
        }
        
        try {
            

        Class.forName("com.mysql.jdbc.Driver");
        
        Connection c = DriverManager.getConnection("jdbc:mysql://educos-srv01.informatik."
                + "uni-augsburg.de:3306/theDatabase", "student", "inFormatik2");
    
        Statement abfrage = c.createStatement();

        if (args[0].equals("-modify") && args.length == 4) {
            if (args[2].equals("name")) {
                int id = Integer.parseUnsignedInt(args[1]);
                PreparedStatement testID = c.prepareStatement("UPDATE Hund SET name = ? WHERE "
                        + "EXISTS (SELECT * FROM Hund WHERE ID = ?");
                testID.setString(1, args[3]);
                testID.setInt(2, id);
                testID.executeUpdate();
            }
}

catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
        catch (SQLException e ) {
            System.out.println(e.getMessage());
        }
    }
}
```

Ich hab die SQL Abfrage ergoogled und da wird es genauso gemacht aber irgendwie klappt es nicht.
Hat jemand eine Idee wieso und wie es funktioniert?

Verwendete IDE: Eclipse


Viele Greetz
Walter


----------



## Joose (5. Jun 2015)

Walter91 hat gesagt.:


> ```
> PreparedStatement testID = c.prepareStatement("UPDATE Hund SET name = ? WHERE "
> + "EXISTS (SELECT * FROM Hund WHERE ID = ?");
> ```
> ...



Also dieses SQL Statement schaut sehr komisch aus. Wo hast du das denn gefunden mit dem EXISTS (immer praktisch sowas zu verlinken).

Normalerweise schaut ein UPDATE Statement wie folgt aus

```
UPDATE
   tabelle
SET
   spaltennamen = neuerwert [, spaltennamen = neuerwert]
WHERE
   spaltenname = wert [AND spaltenname = wert]
```

Damit sollte es eigentlich ohne Probleme funktionieren. Die Kontrolle ob ein Datensatz überhaupt existiert ist nicht notwendig das sollte die Datenbank für dich machen. Als Rückgabewert bekommst du ein int welches dir verrät wieviele Datensätze geändert wurden. Wenn 0 geändert wurden dann ist möglicherweise kein Datensatz mit dieser ID vorhanden.


----------



## Walter91 (5. Jun 2015)

Also hier der Link:
SQL: EXISTS Condition
Es ist das Example - With Update Statement und daran hatte ich mich gehalten ^^
Danke für deine Antwort 

[h=2][/h]


----------



## Dompteur (5. Jun 2015)

Du hast in Zeile 30 einen Syntaxfehler im SQL.
Es fehlt die schließende Klasse deines Subselects. Also zwischen ? und "


----------



## Joose (8. Jun 2015)

Walter91 hat gesagt.:


> Es ist das Example - With Update Statement und daran hatte ich mich gehalten ^^



Interessant, kann mich nicht erinnern diese Variante schon mal gesehen zu haben 
Man lernt eben nie aus.


----------



## Dompteur (8. Jun 2015)

Dompteur hat gesagt.:


> Du hast in Zeile 30 einen Syntaxfehler im SQL.
> Es fehlt die schließende *Klasse* deines Subselects. Also zwischen ? und "



Das sollte natürlich *Klammer* und nicht Klasse stehen.


----------

